Django Rest Framework - Get related model field in serializer

PythonDjangoSerializationForeign KeysDjango Rest-Framework

Python Problem Overview


I'm trying to return a HttpResponse from Django Rest Framework including data from 2 linked models. The models are:

class Wine(models.Model):

	color = models.CharField(max_length=100, blank=True)
	country = models.CharField(max_length=100, blank=True)
	region = models.CharField(max_length=100, blank=True)
	appellation = models.CharField(max_length=100, blank=True)

class Bottle(models.Model):

	wine = models.ForeignKey(Wine, null=False)
	user = models.ForeignKey(User, null=False, related_name='bottles')

I'd like to have a serializer for the Bottle model which includes information from the related Wine.

I tried:

class BottleSerializer(serializers.HyperlinkedModelSerializer):
	wine = serializers.RelatedField(source='wine')

	class Meta:
		model = Bottle
		fields = ('url', 'wine.color', 'wine.country', 'user', 'date_rated', 'rating', 'comment', 'get_more')

which doesn't work.

Any ideas how I could do that?

Thanks :)

Python Solutions


Solution 1 - Python

Simple as that, adding the WineSerializer as a field solved it.

class BottleSerializer(serializers.HyperlinkedModelSerializer):
	wine = WineSerializer(source='wine')

	class Meta:
		model = Bottle
		fields = ('url', 'wine', 'user', 'date_rated', 'rating', 'comment', 'get_more')

with:

class WineSerializer(serializers.HyperlinkedModelSerializer):

	class Meta:
		model = Wine
		fields = ('id', 'url', 'color', 'country', 'region', 'appellation')

Thanks for the help @mariodev :)

Solution 2 - Python

If you want to get specific field you can use Serializer Fields

https://www.django-rest-framework.org/api-guide/fields/

    class BottleSerializer(serializers.HyperlinkedModelSerializer):
        winecolor = serializers.CharField(read_only=True, source="wine.color")

        class Meta:
            model = Bottle
            fields = ('url', 'winecolor', 'user', 'date_rated', 'rating', 'comment', 'get_more')

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbpipatView Question on Stackoverflow
Solution 1 - PythonbpipatView Answer on Stackoverflow
Solution 2 - PythonRyan JericView Answer on Stackoverflow