Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Rest Framework - Get related model field in serializer

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 :)

like image 383
bpipat Avatar asked Dec 17 '13 11:12

bpipat


People also ask

How do I include related model fields using Django REST Framework?

You just install it pip install drf-flex-fields , pass it through your serializer, add expandable_fields and bingo (example below). It also allows you to specify deep nested relationships by using dot notation. Then you add ? expand=teacher_set to your URL and it returns an expanded response.

What is Slug related field in Django?

SlugField in Django is like a CharField, where you can specify max_length attribute also. If max_length is not specified, Django will use a default length of 50. It also implies setting Field.

What is the difference between ModelSerializer and HyperlinkedModelSerializer?

The HyperlinkedModelSerializer class is similar to the ModelSerializer class except that it uses hyperlinks to represent relationships, rather than primary keys. By default the serializer will include a url field instead of a primary key field.


1 Answers

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 :)

like image 92
bpipat Avatar answered Oct 08 '22 11:10

bpipat