我对Django非常陌生,现在我正试图理解抽象模型的用法。假设您正在撰写博客服务,并且您希望经过身份验证的用户和匿名用户都能够评论博客帖子。在一对多中制作模型参考抽象模型
虽然方案是通过验证的用户(只是有一个外键引用一个特定的用户)非常容易的,它不是那么简单,当Authors
不只是User
秒,但无论是AnonymousAuthor
S或RegisteredAuthor
秒。
直接的方法在这里是建筑类层次:
class Author(models.Model):
class Meta:
abstract = True
class AnonymousAuthor(Author):
name = models.CharField(max_length=128)
def display_name(self):
return self.name
class RegisteredAuthor(Author):
user = models.ForeignKey(User)
def display_name(self):
return self.user.user_name
然后BlogPostComment
可以这样定义:
class BlogPostComment(models.Model):
author = models.ForeignKey(Author)
...
我喜欢这种方法,因为无论是谁作者是,我可以轻松构建评论列表,只需遍历BlogPostComment
的设置并为其中的每一个调用display_name()
即可。这里唯一的问题是它不起作用。 Django说:
AssertionError: ForeignKey cannot define a relation with abstract class Author
这里的解决方案是什么?
更新
我知道Generic relations可以帮助在这里。但它是唯一的解决方案吗?感觉像过度杀伤。
通用关系可能是最好的解决方案(想想你的外键关系如何在数据库中实现)。 – thebjorn 2012-08-02 19:19:11