Django模型继承 - 得到孩子

时间:2017-12-03 14:48:56

标签: django

有没有办法访问基本模型的实际子项,意味着:继续使用django文档中的示例,让我们假设我正在为不同的交付餐厅建模,这只是共同的

  • 名称
  • 都有deliver方法

截至:

class Place(models.Model):
    name = models.CharField(max_length=10)

class Pizzeria(Place):
    topping = models.CharField(max_length=10)
    tip = models.IntegerField()

    def deliver(self):
        deliver_with_topping(self.topping)
        ask_for_tip(self.tip)

class Shoarma(Place):
    sauce = models.CharField(max_length=10)
    meat = models.CharField(max_lenght=10)

    def deliver(self):
        prepare_sauce_with_meat(self.sauce, self.meat)

我现在想执行:

Place.objects.get(name="my_place").<GENERIC_CHILD>.deliver()

即。我不需要知道这个地方到底是什么,只需要常见的deliver方法。然后该模型知道&#39;该怎么称呼。

有类似<GENERIC_CHILD>的内容吗?

2 个答案:

答案 0 :(得分:1)

我总是使用Inheritance Manager from django-model-utils进行此类操作。在你的模特上:

class Place(models.Model):
    objects = InheritanceManager()   #<- add inheritance manager
    name = models.CharField(max_length=10)

    def deliver(self):
        pass  #not needed

您的查询:

Place.objects.get_subclass(name="my_place").deliver() 

对我而言,这是一个干净而优雅的解决方案。如果你愿意,别忘了加注django-model-util repo

答案 1 :(得分:0)

我搞得一团糟。
我确实有家长班活动,有孩子-行动,交易,订单班。
我想将它们全部列出在1个地方,1)带有一个指定其类的字段,2)将它们链接到同一页面,在此我将根据Activity类渲染页面

因此在我的模型活动中,我添加:

def get_type(self):
    children = ['action', 'deal', 'order']
    for c in children:
        try:
            _ = self.__getattribute__(c) # returns child model
        except ObjectDoesNotExist:
            pass
        else:
            return c
    else:
        return 'Not specified'