0

まず、私の英語が下手で申し訳ありません。この問題は説明するのが簡単ではないので、理解していただければ幸いです。

私は次のように2つのモデルを持っています:

class A(models.Model):
   code = models.CharField(unique=True, max_length=10)
   list_of_b = models.ManyToManyField('B')


class B(models.Model):
   code = models.CharField(unique=True, max_length=10)

指定された B id のリストと正確に一致する A のインスタンスを取得することを目指しています。

たとえば、データベースに次の A のレコードがあるとします。

id: 1 - code: X - list_of_b: [1, 2, 4, 6]
id: 2 - code: Y - list_of_b: [2, 5, 6]
id: 3 - code: Z - list_of_b: [2, 3, 4, 5, 6]

与えられたリストでは、1では[2, 5, 6]なく、2 と 3 のレコードを取得する必要があります。

次のクエリで、ID が完全に一致するレコードを取得することに成功しました。

queryset = A.objects.prefetch_related('list_of_b')
queryset = queryset.annotate(nb=Count('list_of_b')).filter(nb=len(my_list))
for id in my_list:
    queryset = queryset.filter(list_of_b=id)

レコード 2 では機能しますが、レコード 3 では機能しません。

助けてくれてありがとう。十分に明確でない場合は、遠慮なく質問してください。;)

編集:

もう 1 つ:my_list必要以上の ID が含まれている可能性もあります。たとえば、[2, 5, 6, 7]レコード 2 と 3 を取得する必要があります。

4

1 に答える 1

0

カウントでフィルターを削除するだけです:

queryset = A.objects.prefetch_related('list_of_b')
for id in my_list:
    queryset = queryset.filter(list_of_b=id)
于 2015-03-29T22:13:33.030 に答える