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

wun*_*nki 3 generics django

我正在努力使以下适合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')
Run Code Online (Sandbox Code Playgroud)

问题是我想将它附加到不同的模型.这必须是一种OneToMany关系.因为一篇文章只能有一个出版日期.据我所知,一般关系是一种ManyToMany关系.

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

Dan*_*man 8

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

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

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

    class Meta:
        unique_together('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)

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