Django 模型继承 - 得到 child

标签 django

有没有办法访问基本模型的实际 child ,意思是:继续使用 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)
    

    我现在想执行:
    Place.objects.get(name="my_place").<GENERIC_CHILD>.deliver()
    

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

    有没有类似 <GENERIC_CHILD> ?

    最佳答案

    我总是用 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如果你喜欢它。

    关于Django 模型继承 - 得到 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47619535/

    相关文章:

    python - 如何测试 Django 自定义过滤器?

    python - django admin 中的单选按钮

    javascript - 如何通过javascript使django包含标签中的侧边栏中的元素处于事件状态?

    python - 电子邮件验证和密码重置 - django rest 框架和 angularjs

    python - 使用 python-social-auth 登录 facebook 时遇到错误

    python - 如何在 Django 中使用 Gulp Browsersync?

    django - for循环仅在django中的一个模板中工作

    python - 使用自定义上下文覆盖 Django View (Django 1.11,Viewflow)

    django - 避免在 ModelChoiceField 中加载所有选择以通过 ajax 加载值

    python - Django 模型 - 分配 id 而不是对象