python - 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')
解决方案
你可以用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
推荐阅读
- reactjs - React Router:更改 goBack() 上的 URL 路径
- ms-mpi - LAN网络中多台windows机器中的MS-MPI
- java - 使用resilience4j基于API Key进行速率限制
- python - 如何返回列表中第一个元素的完全匹配
- r - 过滤到观察第一个特定值
- c# - NullReferenceException:对象引用未设置为对象 PickUp.OnTriggerEnter2D 的实例(UnityEngine.Collider2D 碰撞)
- sql - 在 Postgresql 中,如何使用具有多个条件的连接,包括 >= 和 <=
- c# - 如何在C#中使用itextsharp在只读模式下制作excel文件
- javascript - 顶部固定菜单和横幅
- ssl - airflow_celery 中的 ssl 证书有问题