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

Ber*_*rah 1 python django django-rest-framework

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

\n\n

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

\n\n

用户模型

\n\n
@python_2_unicode_compatible\nclass User(AbstractUser):\n    phone = models.CharField(max_length=15, null=True)\n    verified_phone = models.BooleanField(default=False)\n    country = models.ForeignKey(Country, related_name=\'country\')\n    level = models.ForeignKey(UserLevel, related_name=\'user_level\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

用户序列化器

\n\n
class UserModelSerializer(HyperlinkedModelSerializer):\n    class Meta:\n        model = User\n        country = serializers.ReadOnlyField(source=\'country.name\')\n        fields = [\n            \'url\',\n            \'id\',\n            \'username\',\n            \'country\',\n            \'email\',\n            \'phone\',\n        ]\n        read_only_fields = (\n            \'id\',\n            \'password\',\n        )\n
Run Code Online (Sandbox Code Playgroud)\n\n

自定义寄存器序列化器

\n\n
class CustomRegisterSerializer(RegisterSerializer):\n    country = serializers.PrimaryKeyRelatedField(read_only=True)\n\n    def get_cleaned_data(self):\n        return {\n            \'country\': self.validated_data.get(\'country\', \'\'),\n            \'password1\': self.validated_data.get(\'password1\', \'\'),\n            \'email\': self.validated_data.get(\'email\', \'\'),\n            \'username\': self.validated_data.get(\'username\', \'\'),\n    }\n\n    def save(self, request):\n        print(self.get_cleaned_data())\n        adapter = get_adapter()\n        user = adapter.new_user(request)\n        user.country = self.validated_data.get(\'country\',  \'\')\n        self.cleaned_data = self.get_cleaned_data()\n        adapter.save_user(request, user, self)\n        setup_user_email(request, user, [])\n        user.save()\n        return user\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

{用户名:“bernie”,电子邮件:“bernie@d.com”,国家/地区:{\xe2\x80\xa6},密码1:“密码”,密码2:“密码”}

\n
\n\n

但这个错误不断出现,

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

这意味着在这个过程中,国家/地区数据会丢失。

\n\n

我尝试只发送 ID、国家/地区名称,但没有任何效果。我究竟做错了什么?

\n

Pet*_* R. 5

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

这是有问题的线路。

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

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

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