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

问题描述 投票:-1回答:2

我有一个序列化器如下:

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)
django django-rest-framework
2个回答
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',
        )

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
© www.soinside.com 2019 - 2024. All rights reserved.