Django 模型继承 - 得到孩子

Pro*_*e85 5 django

有没有办法访问基本模型的实际孩子,意思是:继续使用 django Docs 中的示例,让我们假设我正在建模不同的外卖餐厅,它们只是有共同点

  • 姓名
  • 都有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)
Run Code Online (Sandbox Code Playgroud)

我现在想执行:

Place.objects.get(name="my_place").<GENERIC_CHILD>.deliver()
Run Code Online (Sandbox Code Playgroud)

即我不需要知道这个地方实际上是什么,只需要知道常用的deliver方法。然后模型“知道”该调用什么。

有类似的东西<GENERIC_CHILD>吗?

dan*_*era 1

我总是使用django-model-utils 中的继承管理器来进行此类操作。在您的模型上:

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

    def deliver(self):
        pass  #not needed
Run Code Online (Sandbox Code Playgroud)

您的查询:

Place.objects.get_subclass(name="my_place").deliver() 
Run Code Online (Sandbox Code Playgroud)

对我来说,这是一个干净而优雅的解决方案。如果您喜欢,请不要忘记启动django-model-util 存储库。