Python Django中的OneToMany查询

Python Django中的OneToMany查询,python,django,django-models,Python,Django,Django Models,在Django中,我很难找到一对多关系查询的最佳方法。最好用一个例子来解释: class Item(models.Model): name = models.CharField(max_length=30) class Attribute(models.Model): item = models.ForeignKey(Item) name = models.CharField(max_length=30) 项目可以有多个属性。让我们假设该属性是特定于某个项目的,尽管如

在Django中,我很难找到一对多关系查询的最佳方法。最好用一个例子来解释:

class Item(models.Model):
    name = models.CharField(max_length=30)

class Attribute(models.Model):
    item = models.ForeignKey(Item)
    name = models.CharField(max_length=30)
项目可以有多个属性。让我们假设该属性是特定于某个项目的,尽管如此多的属性在这里并不合适。如何查找具有name=a1属性但也具有name=a2属性的所有项目

大概是这样的:

a1_objects = Attribute.objects.filter(name="a1").values("item__id")
a2_objects = Attribute.objects.filter(name="a2").values("item__id")
#Take the intersection (does this method of taking an intersection work?)
ids_with_a1_and_a2 = [id for id in a1_objects if id in a2_objects]
#Get item objects with those ids
results = Item.objects.filter(id__in = ids_with_a1_and_a2)

肯定有比我建议的方法更好的方法吗?对我来说,这似乎效率不高。

检查文档中的这一部分:

除非我漏掉了什么,否则过滤
应该可以:

Item.objects.filter(attribute_name="a1").filter(attribute__name="a2")

您的结果将始终是一个空查询集。你的意思是说用item name
a1
a2
获取所有属性名吗?呵呵。我第一次读到的标题是“Django中的一个太多查询”。最好不要有这么多查询!;-)谢谢,我没有意识到你可以跨越两个方向的关系。属性名称中需要一个双下划线,但在其他方面效果很好。很好,只添加了缺少的下划线。很高兴你能找到答案!