Django ORM:未继承子级的字段和值。对象重复。 (使用Django管理界面)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django ORM:未继承子级的字段和值。对象重复。 (使用Django管理界面)相关的知识,希望对你有一定的参考价值。
我正在尝试从共同的(具体的)父母那里继承各种菜肴(比萨饼,潜艇等)class Dish
。 (逻辑上,除了遇到困难之外,我没有其他理由要具体说明实施)。
[每个比萨饼(或其他混凝土菜品)都恰好对应一个菜品ID(此处为FK),而每个菜(ID)就是一个披萨。
我是新手,但根据我的理解,共享字段(名称,类型价格,尺寸和菜品ID(PKDish
中的dish_id
= FK Pizza
中的Dish
))及其值由诸如Pizza
之类的子代继承。理论上是如此。
现在,我按照以下方式实现了这些类。然后,我使用Django Admin界面创建对象,但是与预期相反,当我创建“ Pizza”类型的Dish
对象时,Pizza
对象自动创建。现在,当我进入该Pizza
对象时,名称,类型,价格和尺寸字段为空白。当我选择Pizza
的dish
属性作为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)])
充分利用OneToOne关系,因为您需要一个关系。
类Pizza(models.Model):菜= models.OneToOneField(菜,on_delete = models.CASCADE,related_name =“ dish_id_pizza”)......
这应该解决重复的问题,并预先填充自身和空白字段。
注意:您还应该编写str dunder方法以轻松跟踪每个模型字段。像这样。def str(自己):返回f“ self.name”
希望这会有所帮助
以上是关于Django ORM:未继承子级的字段和值。对象重复。 (使用Django管理界面)的主要内容,如果未能解决你的问题,请参考以下文章