DRF - 嵌套的序列化程序

时间:2016-10-16 08:36:08

标签: django django-rest-framework

我有几个型号

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    gender = models.CharField(max_length=2)
    name = models.CharField(max_length=200)
    birthday = models.DateField(auto_now=False, auto_now_add=False)
    weight = models.IntegerField(default=0)
    heigth = models.IntegerField(default=0)
    sign = models.CharField(max_length=200, choices=SIGNS_CHOICES, default='E')
    orientation = models.CharField(max_length=200, choices=ORIENTATION_CHOICES, default='E')
    bodytype = models.CharField(max_length=200, choices=BODYTYPE_CHOICES, default='E')
    education = models.CharField(max_length=200, choices=EDUCATION_CHOICES, default='E')
    religion = models.CharField(max_length=200, choices=RELIGION_CHOICES, default='E')
    smoking = models.CharField(max_length=200, choices=SMOKING_CHOICES, default='E')
    alcohol = models.CharField(max_length=200, choices=ALCOHOL_CHOICES, default='E')
    kids = models.CharField(max_length=200, choices=KIDS_CHOICES, default='E')
    pets = models.CharField(max_length=200, choices=KIDS_CHOICES, default='E')
    location = models.CharField(max_length=100)
    latitude = models.FloatField()
    longtitude = models.FloatField()

class ProfilePic(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profilePic = models.ImageField(upload_to='Images/', default='Images/None/No-img.jpg')

class ProfileFields(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    order = models.IntegerField(default=0)

和几个serizlizers

class ProfilePicSerializer(ModelSerializer):
    class Meta:
        model = ProfilePic
        fields = [
            'profilePic',
            'user',
        ]

class ProfileSerializer(ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

class ProfileFieldsSerializer(ModelSerializer):
    class Meta:
        model = ProfileFields
        fields = [
            'user',
            'title',
            'text',
            'order'
        ]

我尝试做的是创建将显示个人资料,profilePic和profileFields的用户serizlizer

我是这样做的

class UserSerializer(ModelSerializer):
    profile = ProfileSerializer(many=False)
    profilePic = ProfilePicSerializer(many=False)
    profile_fields = ProfileFieldsSerializer(many=True)

    class Meta:
        model = User
        fields = '__all__'
        write_only_fields = ('password',)
        read_only_fields = ('id',)

    def create(self, validated_data):
        user = User.objects.create(
            username=validated_data['username'],
            email=validated_data['email'],
        )

        user.set_password(validated_data['password'])
        user.save()

        return user

但我收到错误

Got AttributeError when attempting to get a value for field `profilePic` on serializer `UserSerializer`.The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.Original exception text was: 'User' object has no attribute 'profilePic'.

配置文件模型添加到JSON,但profilePicprofileFields返回有关不匹配和属性的错误。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

它不识别用户实例上的profilePic,因为它不存在。如果你尝试user.profilePic,你会得到同样的错误。

您应该能够在related_name模型用户ForeignKey上设置ProfilePic,以便用户拥有profilePic属性,user.profilePic返回用户的个人资料照片。

class ProfilePic(models.Model):
    user = models.OneToOneField(User, related_name="profilePic", on_delete=models.CASCADE)
    ...