Python 什么';在Django中,从父实例查找子实例的最简单方法是什么?
我的应用程序使用类继承来最小化模型之间的重复。My models.py看起来有点像这样: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):
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,直到我弄清楚孩子到底是什么。最后一个如果不是真的需要,是吗?