在Django中从父实例中查找子实例的最简单方法是什么?

时间:2009-11-05 21:22:28

标签: python django

我的应用程序使用类继承来最小化模型中的重复。我的models.py看起来像这样:

class BaseModel(models.Model):
   title = models.CharField(max_length=100)
   pub_date = models.DateField()

class Child(BaseModel):
   foo = models.CharField(max_length=20)

class SecondChild(BaseModel):
   bar = models.CharField(max_length=20)

现在大多数情况下,我的视图和模板只处理Child或SecondChild的实例。但是,有一段时间,我有一个我有BaseModel实例的情况,需要弄清楚哪个类是从该实例继承的。

给定一个BaseModel的实例,让我们称它为基础,Django的ORM提供base.child和base.secondchild。目前,我有一个循环遍历所有这些的方法来弄清楚它。它看起来像这样:

class BaseModel(models.Model):
   ...
   def get_absolute_url(self):
      url = None
      try:
         self.child
         url = self.child.get_absolute_url()
      except Child.DoesNotExist:
         pass
      if not url:
         try:
            self.secondchild
            url = self.secondchild.get_absolute_url()
         except SecondChild.DoesNotExist:
            pass
      if not url:
         url = '/base/%i' % self.id
      return url

这绝对是丑陋的,而且每增加一个孩子课程就会变得更加丑陋。有没有人对更好,更pythonic的方式有任何想法?

3 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但可能值得修改:

def get_absolute_url(self):
    subclasses = ('child', 'secondchild', )

    for subclass in subclasses:
        if hasattr(self, subclass):
            return getattr(self, subclass).get_absolute_url()

    return '/base/%i' % self.id

答案 1 :(得分:0)

我没有多少搞乱Django inheitance,所以我想你不能覆盖模型类中的get_absolute_url()?

如果在很多不同的地方有很多需要这些功能的函数,也许访问者模式可能会有所帮助。

答案 2 :(得分:0)

这个问题的各种形式定期出现在这里。 This answer演示了一种将父类型“强制转换”为其正确子类型的通用方法,而无需查询每个子类型表。这样你就不需要在父类上定义一个覆盖所有情况的怪物get_absolute_url,你只需转换为子类型并正常调用get_absolute_url。