在Django中创建一个多表继承设计通用

时间:2009-11-11 02:46:02

标签: python django inheritance

首先,我用于参考的网页的一些链接:A SO question,以及generic relationsmulti-table inheritance上的Django文档。

到目前为止,我已经设置了多表继承设计。对象(例如:Car,Dog,Computer)可以继承Item类。我需要能够从数据库中检索项目,获取子类,并使用它做一些事情。我的设计不允许逐个检索不同类型的对象,因此我需要使用Item容器将它们全部包装成一个。一旦我有了Item,Django文档说我可以通过引用带有模型名称的属性来获取子类(例如:myitem.car或myitem.computer)。

我不知道我的项目引用了哪种类型的对象,所以我该如何让孩子接触?有没有内置的方法来做到这一点?以下是我的一些其他想法:(有些比其他人更疯狂)

  1. 我以为我可以添加一些 GenericForeignKey的项目 引用了孩子,但我对此表示怀疑 对于父类来说甚至是合法的 通过ForeignKey与孩子联系 类。
  2. 我想我可以有一个 Item中的ForeignKey(ContentType) class,并找到属性 基于的孩子的项目 ContentType的名称。
  3. 最后,虽然是一个丑陋的方法,但我可以保留一个对象类型列表,并尝试将每个作为属性,直到不抛出DoesNotExist错误。
  4. 正如你所看到的,这些提议的解决方案并不那么优雅,但我希望我不必使用其中一个,这里有人可能会有更好的建议。

    提前致谢

2 个答案:

答案 0 :(得分:4)

我在我的一个项目中做了类似于方法2的事情:

from django.db import models
from django.contrib.contenttypes.models import ContentType

class BaseModel(models.Model):
    type = models.ForeignKey(ContentType,editable=False)
    # other base fields here

    def save(self,force_insert=False,force_update=False):
        if self.type_id is None:
            self.type = ContentType.objects.get_for_model(self.__class__)
        super(BaseModel,self).save(force_insert,force_update)

    def get_instance(self):
        return self.type.get_object_for_this_type(id=self.id)

答案 1 :(得分:1)

组合Item模型和ItemType模型的模型会更好。子类化模型听起来不错,在一些边缘情况下很有用,但一般来说,坚持使用与数据库相关的策略是最安全和最有效的,而不是反对它。