如何用CurrentUserDefault更新modified_by字段?遇CharField兼容错误
解决
modified_by字段更新时的类型不匹配错误 嘿,这个问题我之前也碰到过!咱们先理清楚报错的核心原因:你用serializers.CurrentUserDefault()给CharField类型的modified_by赋值,但这个默认值返回的是用户模型实例(被SimpleLazyObject包装的UserProfile对象),而CharField只接受字符串类型,这就导致了类型不兼容的错误。
下面分两种常见场景给你针对性的解决方案:
场景1:模型里的modified_by是外键关联UserProfile
如果你的CustomersTag模型中modified_by是ForeignKey/OneToOneField关联到UserProfile,那序列化器里绝对不能用CharField,得用和外键匹配的字段类型:
- 如果你想存储/返回用户的主键,用
PrimaryKeyRelatedField:
class CustomersTagSerializer(serializers.ModelSerializer): created_by = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) modified_by = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) class Meta: model = CustomersTag fields = ['created_by', 'modified_by', '你的其他字段']
- 如果你想返回用户的某个字符串属性(比如用户名、邮箱),用
SlugRelatedField:
class CustomersTagSerializer(serializers.ModelSerializer): created_by = serializers.SlugRelatedField( read_only=True, slug_field='username', # 替换成你UserProfile里的字符串字段,比如email default=serializers.CurrentUserDefault() ) modified_by = serializers.SlugRelatedField( read_only=True, slug_field='username', default=serializers.CurrentUserDefault() ) class Meta: model = CustomersTag fields = ['created_by', 'modified_by', '你的其他字段']
场景2:模型里的modified_by确实是CharField
如果你的modified_by就是要存储字符串(比如用户名),那得把用户实例转换成对应的字符串值,不能直接用CurrentUserDefault()。可以自定义一个默认值函数:
def get_current_user_identifier(request): # 这里根据需求返回用户的字符串属性,比如username/email if request.user.is_authenticated: return request.user.username return '' # 未登录时的默认值 class CustomersTagSerializer(serializers.ModelSerializer): created_by = serializers.CharField(read_only=True, default=get_current_user_identifier) modified_by = serializers.CharField(read_only=True, default=get_current_user_identifier) class Meta: model = CustomersTag fields = ['created_by', 'modified_by', '你的其他字段']
最后提醒下:先确认你的CustomersTag模型中modified_by的字段类型,这是选择正确方案的关键哦!
内容的提问来源于stack exchange,提问作者Ahmed Othman Mohamed Nazim
相关产品推荐
相关产品推荐

