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

问题描述 投票:0回答:1

我正在尝试从共同的(具体的)父母那里继承各种菜肴(比萨饼,潜艇等)class Dish。 (逻辑上,除了遇到困难之外,我没有其他理由要具体说明实施)。

[每个比萨饼(或其他混凝土菜品)都恰好对应一个菜品ID(此处为FK),而每个菜(ID)就是一个披萨。

我是新手,但根据我的理解,共享字段(名称,类型价格,尺寸和菜品ID(PKDish中的dish_id = FK Pizza中的Dish))及其值由诸如Pizza之类的子代继承。理论上是如此。

现在,我按照以下方式实现了这些类。然后,我使用Django Admin界面创建对象,但是与预期相反,当我创建“ Pizza”类型的Dish对象时,Pizza对象自动创建。现在,当我进入该Pizza对象时,名称,类型,价格和尺寸字段为空白。当我选择Pizzadish属性作为Dish对象时,它们是否应该设置为区域设置我刚创建?

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

无论采用哪种方式,我都会得到重复的条目:1个我创建的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)])
django django-models orm django-orm
1个回答
0
投票

充分利用OneToOne关系,因为您需要一个关系。

类Pizza(models.Model):菜= models.OneToOneField(菜,on_delete = models.CASCADE,related_name =“ dish_id_pizza”)......

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

注意:您还应该编写str dunder方法以轻松跟踪每个模型字段。像这样。def str(自己):返回f“ {self.name}”

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.