【问题标题】:Cannot assign "''": "User.country" must be a "Country" instance无法分配“''”:“User.country”必须是“Country”实例
【发布时间】:2018-07-28 17:03:39
【问题描述】:

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

我在用户模型中有一个国家模型和一个国家字段,它是国家/地区的 FK。

user.models

@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

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',
        )

自定义寄存器序列化器

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”,国家:{…},密码1:“密码”,密码2:“密码”}

但这个错误不断出现,

无法分配“''”:“User.country”必须是“Country”实例。

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

{'country': '', 'password1': 'password', 'email': 'bernie@d.com', 'username': 'bernie'}

这意味着沿线某处,国家数据丢失了。

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我遇到了类似的问题,并发出了类似的警告。在您的情况下,可以通过提供 Country 的实例来修复它。如果 Country 是空字符串,则使用对应的 Country 构造函数和空字符串: user.country = Country('')

    【讨论】:

      【解决方案2】:

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

      这是有问题的行。

      您应该传递Country 对象而不仅仅是一个字符串。例如:

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

      当然,在将其作为对象检索之前,请确保特定的 Country 之前已创建并且存在。

      【讨论】:

      • 感谢 Mark,我按照您的建议做了,但似乎 self.validated_data.get('country', '') 仍然只返回 ' ',因此使查询返回 DoesNotExist 异常
      猜你喜欢
      • 2011-02-22
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2021-11-18
      相关资源
      最近更新 更多