【发布时间】:2012-07-31 19:17:52
【问题描述】:
我对 Django 很陌生,现在我正在尝试了解抽象模型的使用。假设您正在编写一个博客服务,并且您希望经过身份验证的用户和匿名用户都能够评论博客帖子。
虽然对于经过身份验证的用户来说场景非常简单(只有一个外键来引用特定用户),但当 Authors 不仅仅是 Users 而是 AnonymousAuthors 或 RegisteredAuthors 时,情况就不是那么简单了.
这里的直接方法是构建类的层次结构:
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)
...
我喜欢这种方法,因为无论作者是谁,我都可以轻松地构建 cmets 列表,只需遍历 BlogPostComments 集并为它们中的每一个调用 display_name()。这里唯一的问题是它不起作用。 Django 说:
AssertionError: ForeignKey cannot define a relation with abstract class Author
这里有什么解决办法?
更新
我知道Generic relations 可以在这里提供帮助。但它是唯一的解决方案吗?感觉有点矫枉过正。
【问题讨论】:
-
泛型关系可能是最好的解决方案(想想你的外键关系将如何在数据库中实现)。
标签: python django django-models foreign-keys abstract-class