1

我有一个 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 和名称并读取通知列表?

4

1 回答 1

1

我通过同时发送 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 并对其进行写入,但您也可以访问发件人对象本身。您必须在客户端手动保持这些同步。根据required=False,您不必在发布结果时发送 sender 对象,因为服务器read_only也会忽略对该对象的所有更新。

您还可以将sender字段设为只写,因此它不会从服务器发送:

sender = serializers.IntegerField(
    required=False,
    write_only=True, # <---
    allow_none=True,
    blank=True)

我仍在使用 DRF 2.4.4,因此您可能需要为 DRF 3.+ 调整上述语法

于 2015-05-21T20:11:53.497 回答