【问题标题】:ValueError [Object] needs to have a value for field "item_ptr" before this many-to-many relationship can be usedValueError [Object] 需要有一个字段“item_ptr”的值才能使用这种多对多关系
【发布时间】:2020-01-12 20:25:31
【问题描述】:

我是 Python 和 Django 的新手,目前正在开发食品配送应用程序。

尝试添加新的 Pizza 对象时,我在管理员中收到以下错误: "" 需要为字段“item_ptr”设置一个值,然后才能使用这种多对多关系。

我有以下内容:在 models.py

class Item(models.Model):
    name = models.CharField(max_length=64)
    price = models.DecimalField(decimal_places=2,max_digits=10, default=0)
    size = models.CharField(choices=SIZES, max_length=64, default="R")

    def __str__(self):
        return f"{self.name}, {self.size}, ${self.price}"

class Pizza(Item, abstractToppingConfig):
    type = models.ForeignKey(pizzaType, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        if not self.id:
            newItem = Item(name=self.name, price=self.price, size=self.size)
            newItem.save()
            self.item_ptr = newItem
        super(Pizza, self).save(*args, **kwargs)


    def __str__(self):
        return f"{self.type} {self.name}, {self.size}"

我在这里查看了一些答案,并了解到错误是由于在创建 Pizza 对象时未保存父类而发生的。 为此,我试图重写模型保存方法以首先存储 Item 对象并添加关系,但是这似乎都有效。

在 Python shell 中创建和保存对象可以正常工作,但在保存 Pizza 对象时不会发生。

Django 版本:2.2.6

完整回溯:https://gist.github.com/Michelle-lele/7b1e60a7a1cf804bd74cfdaae5091c4e

【问题讨论】:

  • 有人会提供答案,但我在您的代码中看到的一个问题是您继承了 Item 而不将其标记为 abstract。见here。您需要将 abstract=Trueclass Meta 添加到您的 Item 类中,否则它将在数据库中有一个单独的表,并且可能无法按预期工作。
  • 最初是一个抽象类,根据docs.djangoproject.com/en/2.2/topics/db/models/… 将其更改为当前类,因为我想成为数据库中的一个单独的表。这就是我从文档中遵循的示例来覆盖保存方法docs.djangoproject.com/en/3.0/topics/db/models/…

标签: python django


【解决方案1】:

对于任何人来说,这都可能面临同样的问题。我在抽象类中使用了 clean() 方法,从而导致了上述错误。

Django ManyToMany model validation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2017-06-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多