Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';在Django中,从父实例查找子实例的最简单方法是什么?_Python_Django - Fatal编程技术网

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

Python 什么';在Django中,从父实例查找子实例的最简单方法是什么?,python,django,Python,Django,我的应用程序使用类继承来最小化模型之间的重复。My 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):

我的应用程序使用类继承来最小化模型之间的重复。My 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)
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
现在大多数时候,我的视图和模板只处理Child或SecondChild的实例。然而,有时我会遇到这样的情况:我有一个BaseModel实例,需要找出哪个类是从该实例继承的

给定一个BaseModel实例,我们称之为base,Django的ORM提供base.child和base.secondchild。目前,我有一个方法,可以通过循环所有这些方法来解决这个问题。它看起来像这样:

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)
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

那是令人绝望的丑陋,并且随着我每增加一个儿童班而变得更加丑陋。有没有人有什么更好、更像蟒蛇的方法来解决这个问题?

我还没有测试过这个,但它可能值得修补一下:

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

我对Django的本质没有太多的干扰,所以我想您不能在模型类中重写get_absolute_url()


如果在许多不同的地方都有很多功能需要,那么访问者模式可能会有所帮助。

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

我会覆盖它,但有时,我必须使用父级类,它无法访问其子级的get_absolute_url,直到我弄清楚孩子到底是什么。最后一个如果不是真的需要,是吗?