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

标签 django generics

我正在尝试使以下内容适合 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/

相关文章:

django - 禁止(403)CSRF验证失败。请求中止

django - fail_silently 在 send_mail() django 中做什么?

python - 在 Django Graphene Relay 中启用基于 PK 的过滤,同时保留全局 ID

java - Java中使用链表实现的队列

c# - C# 5.0 中的可选泛型类型参数怎么样?

python - 选择有效选项 XXX 不是可用选项之一...但值出现在选择中

django - wkhtmltopdf 只呈现浮图的轴?

java - 关于 PECS java 泛型

generics - 取决于特征的通用实现

python - 如何输入提示返回作为参数传递的类实例并具有默认值的方法?