Как POST сущность, указывающую целочисленный внешний ключ в django rest framework
Я создаю приложение для чата с использованием django rest framework и в настоящее время работаю над сообщениями. Вот мои модели:
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 User. Вот мой ModelViewSet для сообщений:
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-функции, которая мне нужна. Я хочу для каждого сообщения получать имя пользователя, которому оно принадлежит. Но теперь я хочу следующее: когда я ПОСТАВЛЯЮ новое сообщение, я хочу иметь возможность указать пользователя, которому оно принадлежит, указав его id. Сейчас у меня есть только поле "text" в секции POST. Мне нужно добавить поле "user", которое принимает целое число (первичный ключ пользователя), чтобы указать, какому пользователю принадлежит сообщение. Как я должен рефакторить свой код, чтобы сделать это?
Поскольку вы переопределили поле user
и установили его в значение read_only=True
, вы не можете установить пользователя при создании/обновлении модели.
Если вам нужно только имя пользователя, я бы предложил вам добавить поле 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",
...
Теперь вы должны иметь возможность установить идентификатор пользователя.