我的应用程序使用类继承来最小化模型中的重复。我的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的方式有任何想法?
答案 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。