Django ManyToMany 通用“通过”模型

Posted

技术标签:

【中文标题】Django ManyToMany 通用“通过”模型【英文标题】:Django ManyToMany generic "through" model 【发布时间】:2012-06-12 20:18:06 【问题描述】:

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

我决定创建一个中间表(向ManyToManyField 提供一个“通过”参数),它将保存订购信息:

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()

出现以下问题:

    是否可以在 django 中为 m2m 提供一个“直通”模型,让两个外键都指向一个通用关系(如上面的那个)?如果是这样 - 如何实现? 如果可以做到这一点 - 这种模型能否在多个 m2m 字段之间保持通用关系?喜欢:班级 中级 学生、画廊 中级 照片 - 都使用中级作为“通过”模型?? 编辑:刚刚测试过 - 我可以 ;) 我可以将抽象类与“通过”表一起使用吗?我想通了——如果上面提到的复杂场景不起作用,我可以创建两个提供排序和其他东西的抽象类,然后总是创建普通的子类来实际建立一些关系:)

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我想在中间模型中有订单字段。我想创建一个通用的即插即用 GalleryField。拥有通用中间模型可以让我省去一些繁重的元类修补(自动创建中间表)。以下是实现此目的的一些基本步骤(imaging.fields.GalleryField 和imaging.models 中的模型摘要)github.com/pielgrzym/django-imaging.git

以上是关于Django ManyToMany 通用“通过”模型的主要内容,如果未能解决你的问题,请参考以下文章

通过特定的 ManyToMany 对象订购 Django QuerySet

django 模型:如何克服“通过”ManyToMany 选项限制

django ManyToMany 通过帮助

Django ManyToMany 通过不同步或迁移

Django 模型 ManytoMany getter

在 Django 的 ManyToMany 关系中按 id 添加对象