【问题标题】:Django-Rest-Framework POST request to ManyToMany Field对多对多字段的 Django-Rest-Framework POST 请求
【发布时间】:2019-11-20 10:36:30
【问题描述】:

我有一个 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)

【问题讨论】:

    标签: django api url django-rest-framework many-to-many


    【解决方案1】:

    假设您实现了一个MessageSerializer 类,您可以重写它的create() 方法以支持writable nested representations

    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 创建中。

    这将解决您的错误,因为现在在实际消息保存之前创建了一个真正的发件人。

    【讨论】:

    • KeyError at /chat/messages/'sender'
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 2021-08-01
    • 2020-11-18
    • 2013-11-12
    • 1970-01-01
    • 2023-03-14
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多