gpt4 book ai didi

Django:与 Contenttypes 的通用一对多关系

转载 作者:行者123 更新时间:2023-12-01 09:39:39 24 4
gpt4 key购买 nike

我正在尝试使以下内容适合 Django ORM。有一个 Publish 模型来管理不同类型内容的发布(其他模型)。这样我就可以轻松地执行 Publish.objects.all() 并按日期排序。我做了一个通用模型如下:

class Publish(models.Model):
""" Intermediary model for displaying and managing different types of content """
status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=1)
publish = models.DateTimeField(_('publish'), default=datetime.datetime.now)

content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')

问题是我想把它附加到不同的模型上。这必须是 OneToMany 关系。因为一篇文章只能有一个发表日期。据我所知,通用关系是 ManyToMany 关系。

我曾尝试在 admin.py 的 max_num 中限制 extraGenericTabularInline,但这不是一个很好的工作解决方案。有谁知道如何将 Publish 模型附加到几个不同的模型,使其成为必需的一对多关系?许多是发布模型,一个是前。一篇文章。

最佳答案

您的假设是不正确的 - 通用外键是一对多,而不是多对多。您可以看到您的模型具有 content_objectobject_id 字段 - 即这个 Publish 实例链接到单个目标对象,尽管该对象可以有多个 Publish 实例。

看起来,您真正想要的是 OneToOne 模型。您可以使用您拥有的模型模拟这一点,您可以简单地限制发布对象的创建,以便每个目标对象只能有一个。您可以通过在 Meta 子类中的 unique_togethercontent_type 上设置 object_id 来做到这一点。

class Publish(models.Model):
... fields ...

class Meta:
unique_together('content_type', 'object_id')

您可能要考虑的另一个选项是不要使用泛型关系,而是尝试多表模型继承,其中每个对象都从 Publish 继承。

关于Django:与 Contenttypes 的通用一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1855240/

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