首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能指定"''":"User.country“必须是"Country”实例

不能指定"''":"User.country“必须是"Country”实例
EN

Stack Overflow用户
提问于 2018-02-18 07:59:01
回答 2查看 636关注 0票数 1

我正在使用django-rest-auth中的自定义寄存器序列化程序来在注册时添加新字段。

我有一个国家模式和一个国家领域在用户模型,是一个FK国家。

user.models

代码语言:javascript
复制
@python_2_unicode_compatible
class User(AbstractUser):
    phone = models.CharField(max_length=15, null=True)
    verified_phone = models.BooleanField(default=False)
    country = models.ForeignKey(Country, related_name='country')
    level = models.ForeignKey(UserLevel, related_name='user_level')

user.serializers

代码语言:javascript
复制
class UserModelSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = User
        country = serializers.ReadOnlyField(source='country.name')
        fields = [
            'url',
            'id',
            'username',
            'country',
            'email',
            'phone',
        ]
        read_only_fields = (
            'id',
            'password',
        )

自定义寄存器序列化器

代码语言:javascript
复制
class CustomRegisterSerializer(RegisterSerializer):
    country = serializers.PrimaryKeyRelatedField(read_only=True)

    def get_cleaned_data(self):
        return {
            'country': self.validated_data.get('country', ''),
            'password1': self.validated_data.get('password1', ''),
            'email': self.validated_data.get('email', ''),
            'username': self.validated_data.get('username', ''),
    }

    def save(self, request):
        print(self.get_cleaned_data())
        adapter = get_adapter()
        user = adapter.new_user(request)
        user.country = self.validated_data.get('country',  '')
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        setup_user_email(request, user, [])
        user.save()
        return user

从以国家为对象的客户端发送的数据示例

{用户名:"bernie",电子邮件:"bernie@d.com",国家:{…},password1:“密码”,password2:“密码”}

但这个错误不断出现,

不能指定"''":"User.country“必须是"Country”实例。

当我在控制台上打印请求时,这就是我得到的

{“国家”:“”,“密码1”:“密码”,“电子邮件”:“bernie@d.com”,“用户名”:“bernie”}

这意味着沿着这条线的某个地方,国家数据就丢失了。

我试过只发送身份证,国家的名字,但没有任何效果。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 09:13:02

user.country = self.validated_data.get('country', '')

这是有问题的台词。

您应该传递Country对象,而不是只传递字符串。例如:

country_obj = Country.objects.get(name=self.validated_data.get('country', '')) user.country = country_obj

当然,要确保特定的Country是在之前创建的,并且在作为对象检索它之前是存在的。

票数 5
EN

Stack Overflow用户

发布于 2020-11-23 09:40:09

我也有过类似的问题,也有类似的警告。在您的情况下,可以通过提供国家实例来解决这个问题。如果Country是空字符串,则使用带有空字符串的相应Country构造函数: user.country = Country('')

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48849610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档