Django嵌套序列化器

时间:2018-08-22 05:21:54

标签: django django-rest-framework

我是Python / Django / DRF的新手。我不确定如何处理以下情况:

我有以下3种模型:ArticleImageImageEntryItem,如何使ArticleSerializer使用ImageSerializer?

class Article(models.Model):
    headline = models.CharField(_('headline'), max_length=255, db_index=True)
    body = models.TextField(blank=True, null=True)

class ImageEntryItem(models.Model):
    image = models.ForeignKey(Image)
    entry = models.ForeignKey(Article, related_name='imageentryitems')
    order = models.IntegerField(null=True, blank=True)

class Image(models.Model):
    exif = models.TextField(null=True, blank=True)

    def get_image_url(self):
    # return image url

这是我当前的文章序列化程序:

class ArticleSerializer(serializers.ModelSerializer):
    first_image = serializers.SerializerMethodField()

    class Meta:
        model = Article
        fields=('headline', 'body', 'first_image')

    def get_first_image(self, article):
        first_image = article.imageentryitems.all()[0].image

        image_url = first_image.get_image_url()
        exif = first_image.exif

        return {
            image_url: image_url,
            exif: exif
        }

我可以做一些事情来使用像http://www.django-rest-framework.org/api-guide/relations/#nested-relationships这样的ImageSerializer吗?我不确定在此如何操作,因为Aritcle与Image没有直接关系,如何在ImageSerialzier上使用article.imageentryitems.all()[0].image

class ArticleSerializer(serializers.ModelSerializer):
    first_image = ImageSerializer(read_only=True)

1 个答案:

答案 0 :(得分:2)

ImageSerializer 中的source [DRF-Doc]参数用作

class ArticleSerializer(serializers.ModelSerializer):
    first_image = ImageSerializer(read_only=True, source='imageentryitems', many=True)

OR

将您的 get_first_image() 方法更改为

class ArticleSerializer(serializers.ModelSerializer):
    first_image = serializers.SerializerMethodField()

    class Meta:
        model = Article
        fields = ('headline', 'body', 'first_image')

    def get_first_image(self, article):
        return ImageSerializer(article.imageentryitems, many=True).data