1

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 Answer 1

3

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')
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much! This works perfectly. However, I had to add .values('rating') as I received the error Object Rating is not JSON serializable I edited your answer correspondingly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.