在使用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)
项目可以有多个属性。假设该属性特定于某个项目,因此ManyToMany在此处不合适。如何查找具有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)
当然有比我建议的方法更好的方法吗?这对我来说似乎没有效率。
答案 0 :(得分:0)
请在文档中查看此部分:Spanning multi-valued relationships
除非我遗漏某些内容,否则过滤Item
应该有效:
Item.objects.filter(attribute_name="a1").filter(attribute__name="a2")