25

Tag モデルのインスタンスの pk リストがあるとします。

pk_list = [10, 6, 3]

タグの m2m フィールドを持つ別のモデルと、正確に 3 つのタグ (上記の pks) を含むインスタンスがあります。

class Node(models.Model):
    ...
    tags = models.ManyToManyField(Tag, related_name='nodes')

pk_list で指定されたタグの正確なセットを含むノードを取得したいと考えています。私がする時

Node.objects.filter(tags__in=pk_list)

3 つの同じインスタンスのリストを返します

[<Node: My node title>, <Node: My node title>, <Node: My node title>]

.get() の呼び出しは機能しません。明らかに、単一のインスタンスを返す必要があるためです。

では、単一のインスタンスを取得するにはどうすればよいでしょうか? 私のpk_listが異なっていた場合、たとえば. [10, 6] または [10, 6, 3, 7] の場合、何も受け取る必要はありません。正確な一致が必要です。

ありがとう

4

1 に答える 1

39

1 つのアプローチは、一連のフィルターを使用することです。

node_query = Node.objects.all()
pk_list = [10, 6, 3]

for pk in pk_list:
    node_query = node_query.filter(tags=pk)

これで、node_query は、pk 10、6、3 のタグが少なくとも3 つあるノードと一致します。3 つのタグを正確に一致させるには、次のようにします。

更新: @janos@Adrián Lópezのおかげで、正解は次のとおりです。

from django.db.models import Count

pk_list = [10, 6, 3]
node_query = Node.objects.annotate(count=Count('tags')).filter(count=len(pk_list))

for pk in pk_list:
    node_query = node_query.filter(tags__pk=pk)
于 2013-05-01T19:07:10.003 に答える