2012-06-08 57 views
3

我正在写一个画廊字段。该字段的子类ManyToManyField并添加了自己的ajax控件和内容。我想让这个解决方案尽可能紧凑(我的意思是 - 如果可能,我想写一点代码在其他项目中重新实现)。Django ManyToMany通用“通过”模型

我决定创建一个中间表(即提供“通过”参数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() 

将出现下列问题:

  1. 是有可能在django中有一个通过m2m的“through”模型,这两个模式的外键都指向一个通用关系(如上面那样)?如果是这样 - 如何实现这一目标?
  2. 如果可以做到这一点 - 这样的模型可以保持超过一个m2m字段之间的通用关系吗? Like:类< - >中级< - >学生,图库< - >中级< - >照片 - 两种都使用Intermediate作为'through'模型?
  3. 编辑:刚刚测试 - 我可以;)我可以使用抽象类与“通过”表?我想通了 - 如果上述复杂的方案将不会工作,我可以只创建一个提供订货两个抽象类和一些其他的东西,然后总是创造正常的子类,以真正建立一些关系:)

回答

1

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

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

+0

我想在中间模型中有订单字段。我想创建一个通用的plug'n'play GalleryField。具有泛型中间模型会让我省下一些沉重的元类修补(自动创建中间表)。以下是实现此目的的一些基本步骤(imaging.fields.GalleryField和imaging.models中的模型摘要)https://github.com/pielgrzym/django-imaging.git – pielgrzym