【发布时间】: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=True和class Meta添加到您的Item类中,否则它将在数据库中有一个单独的表,并且可能无法按预期工作。 -
最初是一个抽象类,根据docs.djangoproject.com/en/2.2/topics/db/models/… 将其更改为当前类,因为我想成为数据库中的一个单独的表。这就是我从文档中遵循的示例来覆盖保存方法docs.djangoproject.com/en/3.0/topics/db/models/…