gpt4 book ai didi

python - 使模型引用一对多抽象模型

转载 作者:太空狗 更新时间:2023-10-30 02:48:45 24 4
gpt4 key购买 nike

我是 Django 的新手,现在我正在尝试了解抽象模型的使用。假设您正在编写博客服务,并且您希望经过身份验证的用户和匿名用户都能够对博客文章发表评论。

虽然场景对于经过身份验证的用户来说非常简单(只需要一个外键来引用特定用户),但当 Authors 不仅仅是 User 而是AnonymousAuthorRegisteredAuthor

这里的直接方法是构建类的层次结构:

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可以在这里提供帮助。但这是唯一的解决办法吗?感觉有点矫枉过正。

最佳答案

与模型不同,通用关系是为许多对象创建外键的解决方案。一般来说,如果你有继承:

class Animal(models.Model):
...

class Dog(Animal):
...

然后:

models.ForeignKey(Animal)

您也可以将 Dog 存储为外键,因为 DogAnimal。但是,在抽象类的情况下,它们不符合被设置为外键目标的条件,因为它们不存在。 Django 的“抽象”模型更接近于“mixin”的定义:它们从不自己实例化,而是用于组合其他实例化的类。

所以你在这里有三个选择:

  1. Author 改为标准模型而不是抽象。然后,您可以为 Author 创建外键,并传入您喜欢的 Author 的任何子类。

  2. 使用通用外键

  3. 首先不要分解模型。

这里的最后一个选择实际上是您最好的选择,因为没有理由拥有单独的作者表,因为唯一的区别在于他们是注册的还是匿名的。那是对象的状态,而不是不同类型的对象。就像拥有类似 BlueCar 类的东西是不合适的一样。您有一个 Car 类,“blue”是它的 color 属性的值。

如果你坚持要单独的模型。然后您可以使用代理模型。其中 AnonymousAuthorRegisterAuthor 只是 Author 的别名(它们没有自己的表),但是拥有别名可以让您更改或添加自定义方法,特别是指定自定义管理器的能力,该管理器自动过滤 Author 以分别返回“匿名”或“注册”类型。

关于python - 使模型引用一对多抽象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11783895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com