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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在模型DRF中序列化相关模型的字段相关的知识,希望对你有一定的参考价值。

我有一个序列化器如下:

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)
答案

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

例:

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',
        )
另一答案

使用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

以上是关于在模型DRF中序列化相关模型的字段的主要内容,如果未能解决你的问题,请参考以下文章

序列化 DRF 中的自定义相关字段

Serializer DRF中数据的非模型字段

查询1:M相关模型DRF中的对象

DRF框架serializer之ModelSerializer

drf序列化组件

09.DRF-ModelSerializer