首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django ORM:子代的字段和值未继承。对象重复。(使用Django管理界面)

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

Stack Overflow用户
提问于 2020-05-04 13:32:19
回答 1查看 54关注 0票数 1

我正在尝试从一个普通的(具体的)父母class Dish继承的各种菜肴(比萨饼,Sub,等等)。(从逻辑上讲,除了在实现上遇到困难之外,我没有理由让它变得具体)。

每个比萨饼(或其他具体的菜)恰好对应于一个菜品ID (在这里实现为FK ),并且每个菜品(ID)恰好是一个比萨饼。

我对此并不熟悉,但根据我的理解,Dish中的共享字段(名称、类型价格、大小和菜品ID (Pizza的PK= FK dish_id ))以及它们的值都是由Pizza等孩子继承的。理论就这么多了。

现在我实现了如下所示的类。然后我使用Django Admin接口创建对象,但与预期相反,当我创建一个'Pizza‘类型的Dish对象时,会自动创建一个Pizza对象。现在,当我进入Pizza对象时,name、type、price和size字段都是空白的。当我选择Pizzadish属性作为我刚刚创建的Dish-object时,它们不是已经设置好了吗?

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

无论采用哪种方法,我最终都会得到重复的条目:我为Pizza对象创建的一个pizza,以及为该pizza创建的Dish类型的一个pizza。(反之亦然,1个菜用于创建的菜,1个菜用于我创建的披萨)。

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

代码语言:javascript
复制
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)])
EN

回答 1

Stack Overflow用户

发布于 2020-05-04 13:44:53

使用OneToOne关系,因为你只想要一个。

代码语言:javascript
复制
class Pizza(models.Model):
    dish = models.OneToOneField(Dish, on_delete=models.CASCADE, related_name="dish_id_pizza")

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

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

代码语言:javascript
复制
def __str__(self):
    return f"{self.name}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61585731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档