【问题标题】:How to combine two different Models in serializers module (Django)?如何在序列化程序模块(Django)中组合两个不同的模型?
【发布时间】:2019-11-04 21:23:04
【问题描述】:

我想创建一个注册 API,其中,我的目标是结合用户模型和个人资料模型,以便通过添加用户名、电子邮件、密码(用户模型字段)和性别、薪水、公司来创建新用户,和地址(配置文件模型字段)。我试图使用来自这个link 的源代码。但是,我无法在其中发布任何数据。到目前为止,这是我的代码:

views.py:

class RegisterAPIView(APIView):
    def post(self, request, format=None):
        serializer = ProfileSerializer(data=request.data)
        if serializer.is_valid():
             serializer.save()
             return Response("Thank you for registering", status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

from rest_framework import serializers
from users.models import Profile
from django.contrib.auth.models import User

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ['gender', 'company', 'salary', 'address']

class RegisterBSerializer(serializers.ModelSerializer):   #User Model serializer
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        password = validated_data.pop('password', None)
        user = User.objects.create(**validated_data)
        if password is not None:
            user.set_password(password)
        user.save() 
        Profile.objects.create(user = user, **profile_data)
        return user

谁能提示我偏离轨道的地方?

我无法通过 DRF 添加数据: image

通常,我应该得到一个正文,其中说明:

{"username" : "this field is required",
"email" : "this field is required",
"password" : "this field is required", (will be hashed using set_password())
"gender" : "this field is required",} etc etc...

【问题讨论】:

  • 您尝试 POST 时遇到什么错误?
  • 在您的 RegisterAPIView 类中将 ProfileSerializer 更改为 RegisterBSerializer 类。
  • @ShakibHossain 请查看上图。
  • @JagjeetSingh 是的,我试过了,但还是不行。请查看上面的图片以更清楚地说明我的意思。谢谢
  • @jelly_bean 那是因为权限。检查 DRF 权限here 并设置您的默认权限。

标签: django python-3.x django-rest-framework


【解决方案1】:

您可以通过编写像这样的自定义to_representation 方法来做到这一点

class RegisterBSerializer(serializers.ModelSerializer):   #User Model serializer
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def to_representation(self, instance):
        data = super().to_representation(instance)
        profile = data.pop('profile', {})
        data.update(profile)
        return data

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2019-03-26
    • 2018-12-21
    • 2014-03-23
    • 1970-01-01
    • 2017-02-08
    • 2021-05-29
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多