我正在尝试从共同(具体)父级继承的各种菜肴(比萨饼,Subs等)class Dish
.(从逻辑上讲,除了遇到困难之外,我没有理由让它具体化。 实现它)。
每个比萨饼(或其他混凝土菜肴)只对应一个菜肴ID(此处实现为FK)和每个 菜(ID)正好是一个比萨饼。
我是新手,但根据我的理解,共享字段(名称、类型价格、大小和菜肴 ID(PK 对于Dish
= FKdish_id
对于Pizza
)Dish
) 及其值 由Pizza
等孩子继承。理论就这么多。
现在我按如下方式实现了这些类。然后我使用 Django 管理界面来创建对象,但是 与预期相反,当我创建一个类型为"Pizza"的Dish
对象时,自动Pizza
对象是 创建。现在,当我进入该Pizza
对象时,名称,类型,价格和尺寸字段为空。 当我选择Pizza
的dish
属性作为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}"