3

Djangoで「条件付き」注釈を付けることは可能ですか? たとえば、次のモデルがあるとします。

class Author(models.Model):
   name = models.CharField()

class Article(models.Model):
   title = models.CharField()
   published = models.BooleanField()

ここで、限定された (フィルター処理された) 著者のクエリセットを選択し、後で使用するために (著者のクエリセットにフィルターを適用したり、注文したりするなど)、書籍の総数と出版された書籍の数の両方で注釈を付けたいと思います。何かのようなもの

Author.objects.filter(name__icontains = 'a').annotate(total_books = Count('books')).annotate(published_books = Count('books', <here published=true filter>))

とにかくそれは可能ですか?

4

2 に答える 2

1

Django の ORM 呼び出しは SQL に変換されます。SQL クエリで実行できない場合は、通常、ORM でも実行できないことを意味します。あなたが要求しているのは別のwhere条項であり (私が何かを見逃していたり​​、誤解していない限り)、別のクエリが必要です。これにより、次の 2 つのオプションが残ります。

  1. 2 つの異なるクエリを実行する (異なるfilter()引数を使用)
  2. これが 2 回実行したくない「高価な」クエリである場合は、DB からデータを 1 回プルするだけで、通常の Python コードで集計を実行できます。
于 2013-02-10T23:26:24.937 に答える
0

簡単に考えてみると、次のことを試すことができます。

Author.objects.filter(name__icontains = 'a').\
    annotate(total_books = Count('books')).\
    annotate(published_books = Count('books__published'))

は 0/1 整数として書かれているのでBooleanField、仕事をするかもしれません。または、そうでない場合もあります:)コード内で試してみてください。

于 2013-05-24T06:58:11.327 に答える