Asif Biswas
Asif Biswas

Reputation: 171

drf: Add a non-model field in Serializer

If receiver==me then the name will be sender name, else name will be receiver name.

I can do it in views.py, but is it possible in serializers.py?

here is my code:

models.py:

class Message(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
    receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')
    body = models.TextField(max_length=1000)
    date =  models.DateTimeField(auto_now_add=True)
    seen = models.BooleanField(default=False)

    class Meta:
        ordering = ('date',)

serializers.py:

class SimpleUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','first_name', 'last_name')

class GetMessageSerializer(serializers.ModelSerializer):
    sender = SimpleUserSerializer()
    receiver = SimpleUserSerializer()
    #name = ....????

    class Meta:
        model = Message
        fields = ('sender','receiver','body','date','seen')

Upvotes: 1

Views: 1329

Answers (1)

Felix Eklöf
Felix Eklöf

Reputation: 3740

You can do something like this with a SerializerMethodField

class GetMessageSerializer(serializers.ModelSerializer):
    sender = SimpleUserSerializer()
    receiver = SimpleUserSerializer()
    name = serializers.SerializerMethodField() #this field will call the method "get_name" in this serializer for value.

    def get_name(self, obj):
        user = self.context['request'].user
        if user==obj.receiver:
            return obj.sender.first_name
        return obj.receiver.first_name

    class Meta:
        model = Message
        fields = ('sender','receiver','body','date','seen', 'name') #added name here

Upvotes: 1

Related Questions