Django ManyToMany通用“通过”模型

时间:2012-06-08 18:51:13

标签: django django-models many-to-many django-orm

我正在写一个画廊领域。字段子类ManyToManyField并添加自己的ajax小部件和东西。我想让这个解决方案尽可能紧凑(我的意思是 - 我想写一些代码,如果可能的话,在另一个项目中重新实现它)。

我决定创建一个中间表(为ManyToManyField提供'through'参数),它将保存订购信息:

class IntermediateModel(models.Model):
    from_content_type = models.ForeignKey(ContentType)
    from_object_id = models.PositiveIntegerField()
    from_content_object = generic.GenericForeignKey('from_content_type', 'from_object_id')
    to_content_type = models.ForeignKey(ContentType)
    to_object_id = models.PositiveIntegerField()
    to_content_object = generic.GenericForeignKey('to_content_type', 'to_object_id')
    order = models.PositiveIntegerField()

出现以下问题:

  1. 是否有可能在django中有一个“直通”模型,其中两个外键都指向一般关系(如上所述)?如果是这样 - 如何实现这一目标?
  2. 如果可以这样做 - 这样的模型能否保持多个m2m场之间的通用关系?喜欢:Class< - >中间< - >学生,画廊< - >中间< - >照片 - 使用Intermediate作为'through'模型??
  3. 编辑:刚刚测试过 - 我可以;)我可以在“通过”表中使用抽象类吗?我想通了 - 如果上面提到的复杂场景不起作用,我可以创建两个提供排序和其他东西的抽象类,然后总是创建正常的子类来实际构建一些关系:)。

1 个答案:

答案 0 :(得分:1)

如果中间模型之间的差异只是你处理它们的方式,也许你只需要将它与“代理”模型一起使用。我的意思是,使用名为“proxy”的Meta选项的Django模型子类化为True。这样,您可以单独处理它们,但将它们存储在同一个数据库表中(如果这是您需要的选项)。

阅读this。也许这就是你想要的。您可以使用2个(或更多)方法访问和处理它们,而不是拥有2个具有相同结构的数据库表。