Django:在父模型中存储公共字段

时间:2014-01-23 09:23:41

标签: python django inheritance

我有一些模特:

class Place(models.Model):
    name = models.CharField(unique=True)

class Bar(Place):
    drinks = models.ManyToManyField('Drink')

class Restaurant(Place):
    meals = models.ManyToManyField('Meals')

这是一个多表继承结构,每个酒吧仅供应饮品,每个餐厅仅供应餐点。但是,我需要在每个地方都有一个独特的名称 - 因此是父Place模型。

现在,多表继承假设父级和子级是独立的实体。这意味着当我想创建一个新的Bar时,我应该这样:

>> parent = Place(name='Myplace')
>> parent.save()
>> child = Bar(place=parent, drinks=mydrinklist)
>> child.save()

但就我而言,Place不是一个单独的实体:它本身不应该存在。它只是一个有一些限制的共享存储。我想要这样的东西:

>> child = Bar(name='Myplace', drinks=mydrinklist)
>> child.save()

其中name属性自动传递给基础父模型,并且在调用Place时静默创建save()模型。 SQLAlchemy可以通过其多表继承来实现。有没有办法在Django中实现相同的目标?

2 个答案:

答案 0 :(得分:3)

Django的abstract base classes解决了在模型之间共享公共字段的问题:

class Place(models.Model):
    name = models.CharField(unique=True)

    class Meta:
        abstract = True

编辑:尽管如此,正如Daniel在评论中提到的那样,您提出的解决方案应该可以正常运行。这里有更多关于Django's multi-table inheritance

的信息

答案 1 :(得分:0)

丹尼尔罗斯曼提到,我完全错了:Django确实以我描述的方式工作。