首页 > 解决方案 > drf:在 Serializer 中添加非模型字段

问题描述

如果receiver==me 那么名字就是发送者名字,否则名字就是接收者名字。

我可以在views.py 中做到这一点,但是在serializers.py 中可以吗?

这是我的代码:

模型.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',)

序列化程序.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')

标签: pythondjangodjango-rest-framework

解决方案


你可以用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

推荐阅读