Django - 全部连接M2M条目?

时间:2013-07-25 13:41:24

标签: django django-models django-orm

拥有简化模型:

subproducts = models.ManyToManyField("self", blank=True, symmetrical=False)
active = models.BooleanField(default=False, db_index=True)

和这样的数据:

  • 产品1
    • SubP 1
    • SubP 2
  • 产品2
    • SubP 3
    • SubP 4
  • 产品3
    • SubP 5
    • SubP 6

假设产品1-3是主要产品,SubP *是子产品。 具有产品1和产品3的ID的元组:(1,3)

我想得到他们所有的子产品,所以我的查询应该返回(SubP 1,SubP 2,SubP 5,SubP 6)

如何编写该查询?我可以循环列表并对每个产品进行1次查询,但是包含1000个对象的列表会终止我的数据库。 还有更好的办法吗?

1 个答案:

答案 0 :(得分:1)

您可以这样做:

class MyModel(models.Model):
    subproducts = models.ManyToManyField("self", blank=True, symmetrical=False)

查询将是:

sub_products = MyModel.objects.filter(mymodel__id__in=[1, 3]).distinct()

如果您有权访问对象列表,

sub_products = MyModel.objects.filter(mymodel__in=[<object_list>]).distinct()

更多info on M2M relationships here(阅读:Reverse m2m queries are supported (i.e., starting at the table that doesn’t have a ManyToManyField):