django类带有一组“父”外键问题

时间:2010-03-20 15:04:02

标签: django inheritance foreign-keys

假设我有一个名为Fruit的类,其中包含各种Fruit的子类以及它们自己的特定属性,我想在FruitBasket中收集它们:

类Fruit(models.Model):
type = models.CharField(max_length = 120,默认='banana',选项= FRUIT_TYPES)
...

班级香蕉(水果):
“”“香蕉(水果类型)”“” length = models.IntegerField(blank = True,null = True) ...

橘子(水果):
“”橙色(水果类型)“”“ diameter = models.IntegerField(blank = True,null = True) ...

类FruitBasket(models.Model):
fruits = models.ManyToManyField(Fruit) ...

我似乎遇到的问题是当我检索并检查FruitBasket中的Fruits时,我只检索Fruit基类并且无法获得Fruit子类属性。

我想我理解发生了什么 - 当从数据库中检索数组时,检索的唯一字段是Fruit基类字段。但是有没有办法在没有多个昂贵的数据库事务的情况下获得子类属性? (例如,我可以获取数组,然后通过每个数组元素的id检索子类Fruit类。)

提前感谢,查克

2 个答案:

答案 0 :(得分:0)

http://docs.djangoproject.com/en/dev/topics/db/models/#id7

诀窍在于,因为它是对Fruit类的引用,你可能不知道它是哪种类型的水果。但假设您这样做,那么您只需通过自动OneToOne关系访问子类的实例:mybasket.fruits.all()[0].orange

答案 1 :(得分:0)

我们通过向父类添加通用外键来解决此问题。 save()完成后,子节点的类/ id将保存在父节点中。然后当你有一个父对象数组(在这种情况下为Fruits)时,你可以说parent.child并且你拥有完整的子类对象。这个问题出现了很多次,我有点惊讶它至少在ORM功能的愿望清单上。 (或者也许是,我只是错过了它......)