所以,我在下面列出的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中。
答案 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)
这为其各自的实例引入了两个基类和共享主键空间的附加表,因此可以使用普通外键引用它们。这可能是合理的,具体取决于您对标签的进一步操作。