3

Django はnullonを使用しないことを推奨していCharFieldますが、 annotate はカウントに空の文字列を含めます。クエリから空の文字列を含む行を除外せずにそれを回避する方法はありますか?

私の質問は、単純にクエリを実行する方法ではありませんが、基本的に、注釈/集計カウントに空のフィールドを含めるかどうかです。Django は、文字列ベースのフィールドの NULL の代わりに空を考慮します。

私のモデル:

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

class Review(models.Model):
    book = models.ForeignKey()
    category = models.ForeignKey()
    review = models.CharField(max_length=200, default='', blank=True)

空でないレビューをカウントし、カテゴリ別にグループ化するには、次を使用します

Review.objects.values('category').annotate(count=Count('review'))

annotate は空の値もカウントするため、これは機能しません (エントリが NULL の場合はカウントされません)。注釈呼び出しの前に空の文字列を除外できますが、クエリはより複雑で、すべての空オブジェクトと空でないオブジェクトが必要です。

注釈を使用してカウントから空の値をスキップするよりスマートな方法はありますか、またはモデルを変更する必要があります

review = models.CharField(max_length=200, default='', blank=True)

review = models.CharField(max_length=200, default=None, blank=True, null=True)
4

2 に答える 2

0

...そして、すべての空のオブジェクトと空でないオブジェクトが必要です。

を使用する場合、これは意味がありませんvalues。実際のオブジェクトの代わりに、categorycountキーだけを含む辞書のリストを取得します。の数値が異なることを除けば、count空の値を除外reviewするかどうかに違いはありません。その上で、1 冊の本 ( id=2) をフィルター処理し、複数のレビューがあることをどういうわけか期待します。

正確に何をしようとしているのか、モデル定義がそれにどのように適合するのかを真剣に再考する必要があります。

于 2014-05-25T08:14:00.063 に答える