Django模型继承 - 获取子类

5
有没有一种方法可以访问基本模型的实际子类,也就是说:假设我正在对不同的外卖餐厅建模,并且它们都有以下共同点:

  • 名称
  • 都有一个名为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方法。然后模型就知道该如何调用。

是否有类似于<GENERIC_CHILD>的东西?


2
我使用http://django-model-utils.readthedocs.io/en/latest/managers.html它运行得非常好。 - dani herrera
完美,谢谢,我会接受它作为答案 - 我想如果有额外的包来处理这个问题,那么它可能不是由Django本身提供的... - ProfHase85
2个回答

1

我总是使用django-model-utils中的Inheritance Manager来进行这种操作。在你的模型上:

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仓库点赞。


0

我以一种混乱的方式完成了它。
我有一个父类Activity,带有子类-Action、Deal、Order类。
我想在一个地方列出它们所有的内容,1)用一个字段指定它的类,2)将它们链接到同一页,在那里我将根据Activity类呈现页面。

因此,在我的模型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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接