Как 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:

enter image description here

Код, который я написал до сих пор, работает очень хорошо для 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",
  ...

Теперь вы должны иметь возможность установить идентификатор пользователя.

Вернуться на верх