Django ORM:孩子的字段和值不继承。对象重复。(使用 Django 管理界面)



我正在尝试从共同(具体)父级继承的各种菜肴(比萨饼,Subs等)class Dish.(从逻辑上讲,除了遇到困难之外,我没有理由让它具体化。 实现它)。

每个比萨饼(或其他混凝土菜肴)只对应一个菜肴ID(此处实现为FK)和每个 菜(ID)正好是一个比萨饼。

我是新手,但根据我的理解,共享字段(名称、类型价格、大小和菜肴 ID(PK 对于Dish= FKdish_id对于Pizza)Dish) 及其值 由Pizza等孩子继承。理论就这么多。

现在我按如下方式实现了这些类。然后我使用 Django 管理界面来创建对象,但是 与预期相反,当我创建一个类型为"Pizza"的Dish对象时,自动Pizza对象是 创建。现在,当我进入该Pizza对象时,名称,类型,价格和尺寸字段为空。 当我选择Pizzadish属性作为Dish对象时,它们不应该准备好吗 我刚刚创建?

而且当我开始创建一个Pizza,选择相应的父级(或在 Django 管理界面),我需要填充所有公共字段两次(一次在Dish中,然后在Pizza中再次)。

无论我以哪种方式这样做,我最终都会得到重复的条目:我创建的Pizza对象 1 个披萨 和 1 个比萨饼,用于我为该披萨创建的菜肴类型。(反之亦然,创建菜肴 1 道菜,并且 我创造的披萨有 1 道菜)。

我的错误是什么,是设计缺陷还是我创建数据库条目的方式?

class Dish(models.Model):
PIZZA = 'PIZZA'
SUB = 'SUB'
PASTASALAD = 'PASTASALAD'
PLATTER = 'PLATTER'
TYPE_CHOICES = ( (PIZZA, 'Pizza'), (SUB, 'Sub'), (PASTASALAD, 'PastaSalad'), (PLATTER, 'Platter') )
name = models.CharField(max_length=64, blank=True) # blank makes name optional
type = models.CharField(max_length=64, choices=TYPE_CHOICES, blank=True)
size = models.CharField(max_length=1, choices=SIZE_CHOICES, default=SMALL, blank=True)
price = models.DecimalField(max_digits=6, decimal_places=2, default=None)
class Pizza(Dish):
dish = models.ForeignKey(Dish, on_delete=models.CASCADE, related_name="dish_id_pizza")
REGULAR = 'REGULAR'
SICILIAN = 'SICILIAN'
STYLE_CHOICES = ( (REGULAR, 'Regular'), (SICILIAN, 'Sicilian'),)
style = models.CharField(max_length=7, choices=STYLE_CHOICES, default=REGULAR)
topping_count = models.IntegerField(default=0, validators=[MaxValueValidator(5), MinValueValidator(0)])

利用一对一的关系,因为你只想要一个。

class Pizza(models.Model):
dish = models.OneToOneField(Dish, on_delete=models.CASCADE, related_name="dish_id_pizza")

这应该可以解决重复问题并预填充自身和空白字段。

注意:您还应该编写 str dunder 方法来轻松跟踪每个模型字段。

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

最新更新