【问题标题】:Create related model with Djoser使用 Djoser 创建相关模型
【发布时间】:2020-04-28 11:29:36
【问题描述】:

我正在尝试覆盖 Django 中的默认用户创建。我正在使用 Django Rest Framework 和 Djoser。我在这里找到了很好的实现技巧:https://stackoverflow.com/a/49096275/9123009

但我有自定义配置文件模型,称为:与我的自定义用户模型具有 OneToOneField 关系的 Userprofile。

这是我的序列化器:

class UserRegistrationSerializer(serializers.ModelSerializer):
    usr_profile = UserprofileSerializer()
    email = serializers.CharField()
    password = serializers.CharField(
        write_only=True,
        style={'input_type': 'password'}
    )

    class Meta:
        model = get_user_model()
        fields = ('email', 'password', 'usr_profile')

当我尝试向 /auth/users/ 端点发出以下 POST 请求时:

{   
    "email": "adnan@test115.se",
    "password": "xxxxxx",
    "usr_profile": {
      "first_name": "adnan",
      "last_name": "erkoc",
      "cell_no": "23233"
    },
} 

我不断收到 User.profile 必须是 Userprofile 实例的错误。

【问题讨论】:

  • 您是否不需要像您提到的示例中那样覆盖from djoser.serializers import UserCreateSerializer 以使其工作?
  • 是的,我正在使用这条线路:from djoser.serializers import UserCreateSerializer as BaseUserRegistrationSerializer
  • 1) 您是否有所有 settings.py 的工作示例、自定义序列化程序以及为使自定义序列化程序工作共享所做的任何其他工作(例如 GitHub 要点)? 2)在您完成此操作并将所有字段添加到 Meta 类的字段属性后,注册端点是否按预期接受所有字段?我发现自己在自定义序列化程序中继承了 BaseUserRegistrationSerializers 的情况,我已将此序列化程序包含在 settings.py 的 DJOSER 对象中,但发布请求仍然不接受这些字段。

标签: django django-rest-framework djoser


【解决方案1】:

这个问题与 Djoser 无关,而是与 DRF 本身有关。

您可以在 DRF 文档中找到答案

Writable nested serializers

class UserRegistrationSerializer(serializers.ModelSerializer):
    usr_profile = UserprofileSerializer()
    email = serializers.CharField()
    password = serializers.CharField(
        write_only=True,
        style={'input_type': 'password'}
    )

    class Meta:
        model = get_user_model()
        fields = ('email', 'password', 'usr_profile')

    def create(self, validated_data):
        usr_profile = validated_data.pop('usr_profile')
        user = UserModel.objects.create(**validated_data)
        UserProfile.objects.create(user=user, **usr_profile)
        return album

【讨论】:

  • 谢谢。我被困住了: from djoser.serializers import UserCreateSerializer as BaseUserRegistrationSerializer (来自我引用的答案)并使用它(类 UserRegistrationSerializer(BaseUserRegistrationSerializer):) 继承自 (serializers.ModelSerializer) 解决了这个问题,但是我有什么不使用 djoser 的 UserCreateSerializer 会失败吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2021-12-10
  • 2017-11-05
  • 1970-01-01
  • 2021-07-18
  • 2020-10-15
相关资源
最近更新 更多