如何 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。
我正在使用 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。