如何 POST 在 Django 休息框架中指定一个整数外键的实体

How to POST an entity specifiying an integer foreign key in django rest framework

我正在使用 django rest 框架构建聊天应用程序,目前正在处理消息。这是我的模型:

from django.db import models
from django.contrib.auth.models import User

class Message(models.Model):
    text = models.CharField(max_length=500)
    datetime = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE);

我正在使用 Django auth 用户模型。这是我的消息模型视图集:

class MessageViewSet(ModelViewSet):
    queryset = Message.objects.all()
    serializer_class = MessageSerializer

这些是我的序列化程序:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username']

class MessageSerializer(serializers.ModelSerializer):
    user =  UserSerializer(read_only=True)

    class Meta:
        model = Message
        fields = '__all__'

这是我的 API:

到目前为止,我编写的代码非常适合我想要的 GET 功能。我希望每条消息都获得它所属用户的用户名。但是现在我想要以下东西:当我 POST 一条新消息时,我希望能够通过指定用户的 id 来指定它属于哪个用户。现在我只有 POST 部分中的“文本”字段。我需要添加一个“用户”字段,它接受一个整数(用户主键)来指定消息属于哪个用户。我应该如何重构我的代码才能做到这一点?

因为您已经覆盖 user 字段并将其设置为 read_only=True,所以当您是 creating/updating 模特时无法设置用户。

如果您只需要用户的用户名,我建议您直接将 username 字段添加到 MessageSerializer 中:

class MessageSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username', read_only=True)

    class Meta:
        model = Message
        fields = '__all__'

现在您将获得此负载:

{
  "id": 1,
  "user": 1,
  "username": "timi",
  ...

您现在应该可以设置用户 ID。