Django中的通用many2many关系

时间:2012-02-06 23:24:15

标签: python django django-models django-contenttypes

所以,我在下面列出的4个实体是我应用程序中强大而独立的实体,现在问题是每个文章或图片都可以用Presenter或Event“标记”,因为它们是4它们可能变得更加复杂的独立实体将“事件”和“演示者”字段添加到“文章”和“图片”或相反的情况下,这似乎是正确的,特别是因为它们可以没有标记。 从长远来看,其他实体可能需要被标记,并且可能出现其他可标记的实体。

class Article(models.Model):
    #Fields
class Picture(models.Model):
    #Fields
class Presenter(models.Model):
    # Fields
class Event(models.Model):
    # Fields

我越接近某种双头基于通用内容类型的中间模型就像这样(尚未测试,因为它比这更复杂),但我正在寻找想法:

class GenericTag(models.Model):
    # Event,Presenter instance..
    tagcontent_type = models.ForeignKey(ContentType)
    tagobject_id = models.PositiveIntegerField()
    tagcontent_object = generic.GenericForeignKey('tagcontent_type', 'tagobject_id')
    # Picture,Article instance
    objcontent_type = models.ForeignKey(ContentType)
    objobject_id = models.PositiveIntegerField()
    objcontent_object = generic.GenericForeignKey('objcontent_type', 'objobject_id')

然后根据我所拥有的信息进行查询,我认为必须有更优雅的方法来做到这一点,而不必将所有tagmodel作为字段填充到taggablemodels中。

1 个答案:

答案 0 :(得分:2)

没有通用外键的另一种方法是使用模型继承:

class Tag(models.Model):
    pass
class Taggable(models.Model):
    pass

class Article(Taggable):
    # Fields
class Picture(Taggable):
    # Fields
class Presenter(Tag):
    # Fields
class Event(Tag):
    # Fields

class TagInstance(models.Model):
    tagged = models.ForeignKey(Taggable)
    tag = models.ForeignKey(Tag)

这为其各自的实例引入了两个基类和共享主键空间的附加表,因此可以使用普通外键引用它们。这可能是合理的,具体取决于您对标签的进一步操作。