我正在尝试使以下内容适合 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
中限制 extra
和 GenericTabularInline
,但这不是一个很好的工作解决方案。有谁知道如何将 Publish 模型附加到几个不同的模型,使其成为必需的一对多关系?许多是发布模型,一个是前。一篇文章。
最佳答案
您的假设是不正确的 - 通用外键是一对多,而不是多对多。您可以看到您的模型具有 content_object
和 object_id
字段 - 即这个 Publish 实例链接到单个目标对象,尽管该对象可以有多个 Publish 实例。
看起来,您真正想要的是 OneToOne 模型。您可以使用您拥有的模型模拟这一点,您可以简单地限制发布对象的创建,以便每个目标对象只能有一个。您可以通过在 Meta 子类中的 unique_together
和 content_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/