在模型DRF中序列化相关模型的字段

时间:2019-03-05 06:21:13

标签: django django-rest-framework

我有一个序列化器,如下所示:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')

    class Meta:
        model = Image
        fields = (
            'url',
            'photo',
            'prop_post',
        )

这可以。现在,我的PropertyPost中有一个“所有者”字段,我需要将其包含在ImageSerializer中。 我想知道我该怎么做。我以为可能是

    fields = (
        'url',
        'photo',
        'prop_post',
        'prop_post__owner'
    )

但是没有用。任何帮助表示赞赏。 这是我的模特:

class PropertyPost(models.Model):
    owner = models.ForeignKey(
        get_user_model(),
        related_name='posts4thisowner',
        on_delete=models.CASCADE)

class CustomUser(AbstractUser):
    pass


class Image(models.Model):
    prop_post = models.ForeignKey(
        PropertyPost,
        related_name='images4thisproperty',
        on_delete=models.CASCADE)

    photo = models.ImageField(upload_to=upload_update_image, null=True, blank=True)

2 个答案:

答案 0 :(得分:0)

使用SerializerMethodField()将完成任务。 由于您尚未发布模型以及模型之间的关系。 我给了您有关如何实现这一目标的正常想法。 如果还可以添加模型,那就更好了。 我将能够相应地更新答案。

from rest_framework.serializers import SerializerMethodField

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                         slug_field='pk')
    prop_post_title = SerializerMethodField()

    class Meta:
        model = Image
        fields = [
            'url',
            'photo',
            'prop_post',
            'prop_post_title',
        ]

    def get_prop_post_title(self, obj):
        try:

            return obj.prop_post.title
        except:
            return None

答案 1 :(得分:0)

更易于使用“源代码”,您可以使用用户序列化程序填充所有者字段。

示例:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')

    owner = UserSerializer(source="prop_post.owner")   

    class Meta:
        model = Image
        fields = (
            'url',
            'photo',
            'prop_post',
            'owner',
        )