我正在编写一个类似于报纸的 Django 应用程序。我有文章,然后我有出现在某些上下文中的那些文章的定制版本。因此,我可以有一篇文章的版本,它出现在报纸的首页上,并且有一个原始标题的更短版本。因此,我有:
class Article(models.Model):
""" A newspaper article with lots of fields """
title = models.CharField(max_length=255)
content = models.CharField(max_length=255)
# Lots of fields...
我希望有一个CustomArticlè对象作为
Articlè的代理,但具有可选的替代标题:
class CustomArticle(Article):
""" An alternate version of a article """
alternate_title = models.CharField(max_length=255)
@property
def title(self):
""" use the alternate title if there is one """
if self.custom_title:
return self.alternate_title
else:
return self.title
class Meta:
proxy = True
# Other fields and methods
很遗憾,我无法向代理添加新字段:
>>> TypeError: Abstract base class containing model fields not permitted for proxy model 'CustomArticle'
所以,我可以像这样做:
class CustomArticle(models.Model):
# Other methods...
original = models.ForeignKey('Article')
def __getattr__(self, name):
if hasattr(self.original):
return getattr(self.original, name)
else:
return super(self, CustomArticle).__getattr__(name)
但不幸的是,__getattr__
在Django模型中似乎无法使用。由于Article
类中的字段可能会发生更改,因此为CustomArticle创建每个字段的@property
方法并不可行。那么正确的做法是什么?