POST-запрос Django-Rest-Framework для поля ManyToMany - PullRequest
0 голосов
/ 10 июля 2019

У меня есть модель django, которая является сообщением.У него есть имя CharField, а также массив пользователей, который представляет собой ManyToManyField.

Так вот как выглядит мой API:

[
  {
    "id": 13,
    "content": "hej",
    "date": "2019-07-09",
    "sender": {
        "id": 1,
        "username": "william"
    }
  },
  {
    "id": 14,
    "content": "hej william",
    "date": "2019-07-09",
    "sender": {
        "id": 3,
        "username": "ryan"
    }
  }
]

То, что я пыталсяотправить через почтальона POST:

{
    "content": "Hello",
    "sender": {"username": "william"},
    "date": "2019-09-02"
}

Ошибка, которую я получаю:

sqlite3.IntegrityError: NOT NULL constraint failed: chat_message.sender_id

ManyToManyField (Userprofile = User):

class Message(models.Model):
  sender = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="sendermessage")
  content = models.CharField(max_length=500)
  date = models.DateField(default=date.today)
  canview = models.ManyToManyField(UserProfile, blank=True, related_name="messagecanview")

class Meta:
    verbose_name_plural = 'Messages'

def __str__(self):
    return "{sender}".format(sender=self.sender)

1 Ответ

0 голосов
/ 10 июля 2019

Предполагая, что у вас реализован класс MessageSerializer, вы можете переопределить его метод create() для поддержки записываемых вложенных представлений :

class MessageSerializer(serializers.ModelSerializer):
    ...

    def create(self, validated_data):
        sender_data = validated_data.pop('sender')
        sender = UserProfile.objects.create(**sender_data)
        return Message.objects.create(sender=sender, **validated_data)

Вы извлекаете данные sender из словаря, создаете экземпляр UserProfile с атрибутами в нем и затем присоединяете его к своему созданию Message.

Это устранит вашу ошибку, посколькутеперь существует реальный отправитель, созданный за до фактического сообщения было сохранено.

...