Django ORM 继承:您正在尝试将不可为 null 的字段“dish_ptr”添加到 [...] 而没有默认值

Ann*_*nna 5 python django orm django-models

我正在开发一个餐厅应用程序(并且是 Django/Python 的新手)。我想要一个父类 Dish,其中包含一些计数器或 ID,该计数器或 ID 会随着 Dish 子类的每个实例而递增。这些实例是披萨、意大利面等具有不同特征和关系的菜肴。我正在尝试Dish具体说明,因为在这种情况下,我认为我只需访问Dish的 PK,这将为每个菜单项提供一个 Dish-ID。但是,我不知道如何正确修复我遇到的错误:You are trying to add a non-nullable field 'pasta_ptr'

以下是相关代码片段:

class Dish(models.Model):
  pass # should automatically generate PK, right?

class Pasta(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price = models.DecimalField(max_digits=6, decimal_places=2)

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

class Pizza(Dish):
  sizestyle = models.CharField(max_length=4, choices=SIZESTYLE_CHOICES, default=SMALL_REGULAR)
  topping_count = models.IntegerField(default=0, validators=[MaxValueValidator(5), MinValueValidator(0)])
  price = models.DecimalField(max_digits=6, decimal_places=2)

  def __str__(self):
    return f"Price for {self.sizestyle} pizza with {self.topping_count} toppings: ${self.price}"

class Sub(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price_category = models.ForeignKey(SubPrice, on_delete=models.DO_NOTHING, related_name="sub_price_category")

  def __str__(self):
    return f"{self.name}, Price Category: {self.price_category}"

class Platter(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price_large = models.DecimalField(max_digits=6, decimal_places=2, default=0)
  price_small = models.DecimalField(max_digits=6, decimal_places=2, default=0)

  def __str__(self):
    return f"{self.name} price: Large ${self.price_large}, Small ${self.price_small}"
Run Code Online (Sandbox Code Playgroud)

小智 6

如果您想继承Dish()但不在数据库中拥有它,您可以这样做: Django 抽象基类文档

class Dish(models.Model):
    # your model structure

    class Meta:
        abstract = True

class Pizza(Dish):
    # your model structure
Run Code Online (Sandbox Code Playgroud)

当您使用 Dish 时,这只会继承 Dish 中的任何内容。您不会在数据库中看到 Dish 作为表。

如果您确实想将其用作父类,则需要告诉子类 Dish 是父类:django 多对一文档

class Dish(models.Model):
    pass

class Pizza(models.Model):
    dish = models.ForeignKey(Dish, on_delete=models.CASCADE)
    # other model structure
Run Code Online (Sandbox Code Playgroud)

这将在数​​据库中为 Dish 创建一个 id,并且当创建 Pizza 时,它将引用 Dish 的 id (pk)。