3

モデル例:

class Book(models.Model):
    title = models.TextField()

class Author(models.Model):
    book = models.ForeignKey(Book)
    name = models.CharField(max_length=50)

およびいくつかのサンプルデータ:

Book:
id  title
1   test111
2   test222
3   test333
4   test444

Author:
book_id  name
1        test111
1        test222
2        test222
2        test333
3        test111
3        test333
4        test111
4        test333

著者名に '111' と '333' が含まれるすべての本を取得したい (したがって、少なくとも 2 人の著者がいるすべての本: 最初の名前は 111、2 番目の名前は 333)

チェーン クエリを使用して、この目標を達成できます。

books = Book.objects.filter(author__name__icontains="111").filter(author__name__icontains="333")

ID が 3 と 4 の 2 冊の本を返します

Qオブジェクトを使用して目標を達成する方法はありますか?

4

2 に答える 2

6

reduce と Q を組み合わせることができます。Django の Q オブジェクトのパワーの投稿を参照してください。

from django.db.models import Q
import operator
auths = [ "111", "333" ]
query = reduce(operator.and_, [ Q(author__name__icontains=x) for x in auths ] )
books = Book.objects.filter( query )
于 2013-03-12T14:13:49.503 に答える
0

これは動的認証リスト用です。

pk_list = qs.values_list('pk', flat=True)  # i.e [] or [1, 2, 3]

if len(pk_list) == 0:
    Book.objects.none()

else:
    q = None
    for pk in pk_list:
        if q is None:
            q = Q(pk=pk)
        else:
            q = q | Q(pk=pk)

    Book.objects.filter(q)
于 2014-08-02T10:33:49.677 に答える