我正在努力使以下适合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_num和extrain GenericTabularInline,但这不是一个很好的工作解决方案.有谁知道如何将发布模型附加到几个不同的模型,使其成为一个必需的,一对多的关系?许多是Publish模型,一个是ex.一篇文章.
你的假设是不正确的 - 通用外键是一对多,而不是多对多.您可以看到您的模型具有content_object和object_id字段 - 即此Publish实例链接到单个目标对象,尽管该对象可以有许多Publish实例.
你真正想要的是OneToOne模型.您可以使用您拥有的模型模拟它,您可以简单地限制发布对象的创建,以便每个目标对象只能有一个.您可以通过设置做到这一点unique_together上content_type,并object_id在Meta子类.
class Publish(models.Model):
... fields ...
class Meta:
unique_together('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)
您可能要考虑的另一个选项是尝试多表模型继承,而不是使用泛型关系,其中每个对象都继承自Publish.