1
votes

I have a model:

User is the django User model from django.contrib.auth.models

# drink/models.py
class Drink(models.Model):
    name = models.CharField(max_length=32)
    bartender = models.ForeignKey('bartender.Bartender')

# bartender/models.py
class Bartender(models.Model):
    name = models.CharField(max_length=64)
    owner = models.ForeignKey(User)

# property/models.py
class Rating(models.Model):
    bartender = models.ForeignKey('bartender.Bartender')
    owner = models.ForeignKey(User)

I use django rest framework and would like a serializer Field as such:

# bartender/serializers.py
class BartenderSerializer(serializers.ModelSerializer):
    rating = serializers.IntegerField(source='get_rating', read_only=True)

    class Meta:
        model = Bartender
        fields = []

My Viewset is

class BartenderViewset(viewsets.ModelViewSet):
    queryset = Bartender.objects.all()
    serializer_class = BartenderSerializer

how do I add a model method to my Bartender model, such that it returns the Rating object for whatever User is making the call.

I tried this modification to my Bartender class:

# bartender/models.py
class Bartender(models.Model):
    name = models.CharField(max_length=64)
    owner = models.ForeignKey(User)

    def get_rating(self):
        return Rating.objects.get(bartender=self.id, owner=self.request.user)

However self has no request. Therefore, I would like to know how to implement this so it is callable via drf viewsets.

1

1 Answers

3
votes

Actually you can do this without modifying your model. Just evaluate data on serializer level with SerializerMethodField:

class BartenderSerializer(serializers.ModelSerializer):
    rating = serializers.SerializerMethodField()

    class Meta:
        model = Bartender
        fields = []

    def get_rating(self, obj):
        return Rating.objects.get(bartender=obj.id, owner=self.context.get('request').user).values('rating')