【问题标题】:django accessing subclasses of modelsdjango 访问模型的子类
【发布时间】:2011-08-16 20:32:14
【问题描述】:

我在我的 django-models 中使用这样的子类:

class Person(models.Model):
    name = models.CharField(max_length=100)
    ...


class Butcher(Person):
    ...

class Driver(Person):
    ...

在我看来,我想根据子类做某些事情 Person 类的,像这样:

def person_detail_view(request, slug):
    person = Person.objects.get(slug=slug)

    if person.butcher:
        ...

    elif person.driver:
        ...

但是当 Person 是 司机。有没有办法向 Person 类询问它的子类?

提前致谢 雅克

【问题讨论】:

  • 我认为没有直接的方法。您可以做的是将人员类型存储在您的人员模型中,并在您的视图中使用该字段来适当地提取信息。

标签: django models subclass


【解决方案1】:

你的基本逻辑是合理的;问题在于你如何测试。您必须检查属性的存在,而不是它的值。例如:

def person_detail_view(request, slug):
    person = Person.objects.get(slug=slug)

    if hasattr(person, 'butcher'):
        ...

    elif hasattr(person, 'driver'):
        ...

【讨论】:

  • 为什么这完全有效?对于继承的模型,Django ORM 是否会像这样在幕后构建related_name 结构:ParentClass.Subclass?
【解决方案2】:

你不能那样做。 Person 模型查询不同的表 - appname_person、Butcher、不同的和 Driver 另一个。

Django 模型中的继承只会让您再次编写字段,并且不会查询多个表 - 也不应该。

为了达到这个效果,你应该在数据库中有一个Person.type,或者你应该使用Generic Relations,在那里你使Person与你打算创建的所有子类型有通用关系(实际上没有继承和定义通用外键。)

如果每个模型中的字段都相同,只需在人员中添加一个type 字段;或者如果字段完全不同,请遵循通用关系方法。

【讨论】:

    【解决方案3】:

    django-polymorphic 模块实际上做得很好,而且使用起来相当简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多