我正在尝试从一个普通的(具体的)父母class Dish继承的各种菜肴(比萨饼,Sub,等等)。(从逻辑上讲,除了在实现上遇到困难之外,我没有理由让它变得具体)。
每个比萨饼(或其他具体的菜)恰好对应于一个菜品ID (在这里实现为FK ),并且每个菜品(ID)恰好是一个比萨饼。
我对此并不熟悉,但根据我的理解,Dish中的共享字段(名称、类型价格、大小和菜品ID (Pizza的PK= FK dish_id ))以及它们的值都是由Pizza等孩子继承的。理论就这么多了。
现在我实现了如下所示的类。然后我使用Django Admin接口创建对象,但与预期相反,当我创建一个'Pizza‘类型的Dish对象时,会自动创建一个Pizza对象。现在,当我进入Pizza对象时,name、type、price和size字段都是空白的。当我选择Pizza的dish属性作为我刚刚创建的Dish-object时,它们不是已经设置好了吗?
而且,当我开始创建一个Pizza,选择相应的父级(或者在Django管理界面中创建它)时,我需要填充所有公共字段两次(一次在Dish中,一次在Pizza中)。
无论采用哪种方法,我最终都会得到重复的条目:我为Pizza对象创建的一个pizza,以及为该pizza创建的Dish类型的一个pizza。(反之亦然,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)])发布于 2020-05-04 13:44:53
使用OneToOne关系,因为你只想要一个。
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}"https://stackoverflow.com/questions/61585731
复制相似问题