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\')\nRun Code Online (Sandbox Code Playgroud)\n\n用户序列化器
\n\nclass 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 )\nRun Code Online (Sandbox Code Playgroud)\n\n自定义寄存器序列化器
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n从客户端发送的以国家/地区为对象的示例数据
\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我尝试只发送 ID、国家/地区名称,但没有任何效果。我究竟做错了什么?
\nuser.country = self.validated_data.get('country', '')
这是有问题的线路。
您应该传递Country对象而不仅仅是字符串。例如:
country_obj = Country.objects.get(name=self.validated_data.get('country', ''))
user.country = country_obj
当然,Country在将其作为对象检索之前,请确保该特定对象是之前创建的并且存在。
| 归档时间: |
|
| 查看次数: |
767 次 |
| 最近记录: |