0

Django で 1 対多の関係を使用してクエリを実行する最善の方法を見つけるのに苦労しています。例によって最もよく説明されています:

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)

確かに私の提案したアプローチよりも良い方法はありますか? 私には効率的ではないようです。

4

1 に答える 1

0

ドキュメントのこのセクションを確認してください:多値リレーションシップのスパンニング

何か見逃さない限り、フィルタリングItemは機能するはずです。

Item.objects.filter(attribute_name="a1").filter(attribute__name="a2")
于 2013-06-16T23:35:16.623 に答える