vincentf
vincentf

Reputation: 1499

Django nested serializers

I'm new to Python/Django/DRF. I'm not sure how to deal with the following case:

I have the 3 models: Article, Image, ImageEntryItem as below, how can I make ArticleSerializer to use a 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

This is my current Article Serializer:

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
        }

Can I do something to use a ImageSerializer like http://www.django-rest-framework.org/api-guide/relations/#nested-relationships? I'm not sure how to do it here because Aritcle is not directly related to Image, how can I use ImageSerialzier on article.imageentryitems.all()[0].image ?

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

Upvotes: 0

Views: 81

Answers (1)

JPG
JPG

Reputation: 88649

Use source [DRF-Doc] parameter in ImageSerializer as,

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

OR

Change your get_first_image() method as

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

Upvotes: 2

Related Questions