无法指定“''”:“User.country”必须是“国家/地区”实例

时间:2018-02-18 07:59:01

标签: python django django-rest-framework

我在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

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

  

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

但是这个错误不断发生,

  

无法指定“''”:“User.country”必须是“国家/地区”实例。

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

  

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

这意味着在该行的某个地方,国家/地区的数据会丢失。

我尝试过只发送国家/地区的ID,但没有任何作用。我做错了什么?

2 个答案:

答案 0 :(得分:4)

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

这是有问题的一行。

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

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

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

答案 1 :(得分:1)

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