【问题标题】:Writable nested serializers User and User profile doesn't work可写嵌套序列化程序用户和用户配置文件不起作用
【发布时间】:2017-05-05 05:30:02
【问题描述】:

我正在尝试使用他的个人资料通过 django rest 框架创建一个用户注册端点,这表明我没有为我的序列化程序创建显式的 .create() 方法。我错过了什么?

这是我的models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)
    language = models.CharField(max_length=4, default='es')

    def __unicode__(self):
        return "%s - %s" % (self.user, self.language)

我的序列化器.py

class ProfileCreateSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = [
        'language',
        ]


class UserSerializer(serializers.ModelSerializer):
    profile = ProfileCreateSerializer()

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

def create (self, validated_data):
    user = User.objects.create(username=validated_data['username'])
    user.set_password(User.objects.make_random_password())
    profile_data = validated_data.pop('profile')
    Profile.objects.create(user=user, **profile_data)
    user.save()

我的意见.py

class ProfileCreateAPIView(CreateAPIView):
    queryset = User.objects.all()
    model = Profile
    serializer_class = UserSerializer

【问题讨论】:

  • 这真的是你源代码的缩进吗?你能粘贴完整的回溯吗?

标签: python django django-rest-framework


【解决方案1】:

您的代码看起来不错,但您的缩进看起来不对:.create() 方法需要是序列化程序上的一个方法,因此它应该缩进到与class Meta: 语句相同的级别。

它应该看起来像这样(注意create() 方法上的缩进):

class UserSerializer(serializers.ModelSerializer):

    profile = ProfileCreateSerializer()

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

    def create (self, validated_data):
        user = User.objects.create(username=validated_data['username'])
        user.set_password(User.objects.make_random_password())
        profile_data = validated_data.pop('profile')
        Profile.objects.create(user=user, **profile_data)
        user.save()

更多示例请访问DRF Docs (Saving Instances),以防万一。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-03-22
    • 2020-03-19
    • 2019-01-30
    • 2014-10-07
    相关资源
    最近更新 更多