【发布时间】:2020-08-18 11:53:56
【问题描述】:
我正在尝试从一个普通(具体)父级继承的各种菜肴(比萨饼、潜艇等)
class Dish。 (从逻辑上讲,除了遇到困难之外,我没有理由让它变得具体
实现它)。
每个比萨饼(或其他具体菜肴)都对应一个菜肴 ID(在此处实现为 FK),并且每个 菜 (ID) 正好是一个披萨。
我是新手,但根据我的理解,共享字段(名称、类型价格、大小和菜肴 ID(PK
对于Dish = FK dish_id 对于Pizza)) 在Dish 以及它们的值
由子代继承,例如Pizza。理论就讲这么多。
现在我按照下面的方法实现了这些类。然后我使用 Django Admin 界面创建对象,但是
出乎意料的是,当我创建一个“Pizza”类型的Dish 对象时,Pizza 对象自动是
创建的。现在,当我进入那个Pizza 对象时,名称、类型、价格和大小字段都是空白的。
当我选择Pizza 的dish 属性作为Dish-object 时,它们不应该被设置吗
我刚刚创建?
当我开始创建 Pizza 时,选择相应的父级(或在
Django 管理界面),我需要填充所有公共字段两次(一次在Dish,然后再次在Pizza)。
无论我采用哪种方式,我都会得到重复的条目:我创建的 Pizza 对象的 1 个披萨
和 1 个我为该披萨创建的 Dish 类型的披萨。 (反之亦然,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)])
【问题讨论】:
标签: django django-models orm django-orm