我有一个Django模型,它具有与用户相关的字段作为外键。
class Notification(models.Model):
sender = models.ForeignKey(User, null=True)
is_read = models.BooleanField(default=False)
我希望我的序列化程序能够显示此模型的用户ID和名称,所以它就像这样:
{
"count": 45,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sender": {
"id": 2,
"name": "my_name",
}
"is_read": false,
}
]
}
但是当我添加新通知时,我只想发送用户的ID,如下所示:
$ curl -X POST http://127.0.0.1:8000/notifications/ -H "Content-Type: application/json" -d "{\"sender\":\"4\"}"
我尝试在序列化程序中使用超链接:
class NotificationSenderSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'name')
class NotificationSerializer(serializers.ModelSerializer):
sender_name = serializers.NotificationSenderSerializer()
class Meta:
model = Notification
fields = ('id', 'sender', 'is_read')
但是,这样做,我需要在发布新通知时发送用户的ID和名称。
$ curl -X POST http://127.0.0.1:8000/notifications/ -H "Content-Type: application/json" -d "{\"sender\": {\"id\": \"4\", \"name\":\"my_name\"} }"
如何解决此问题,以便我可以仅使用用户ID创建通知,但同时接收通知列表中的ID和名称?
答案 0 :(得分:1)
我 hack 围绕这个问题,同时发送id和obj,但是将obj设为只读:
class NotificationSerializer(serializers.ModelSerializer):
sender_obj = serializers.NotificationSenderSerializer(
source="sender", read_only=True, required=False)
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Meta:
model = Notification
fields = ('id', 'sender', 'sender_obj', 'is_read')
# ^^^^^^ ^^^^^^^^^^
这样,您可以访问发件人ID并可以写入,但您也可以访问发件人对象本身。你必须手动保持这些同步'在客户端。根据{{1}},您在发布结果时不必发送发件人对象,因为required=False
该对象的所有更新都将被忽略由服务器。
您也可以将read_only
字段设为只写,因此不会从服务器发送:
sender
我仍在使用DRF 2.4.4,因此您可能需要调整DRF 3的上述语法。+