1

期待どおりに動作しない非常に単純なクエリがあります。

# Retrieve news                                                               
news = News.objects.filter(available=True)                                    
if area:                                                                      
    news = news.annotate(Count('areas')).filter(Q(areas__count=0)
                                                |Q(areas=area))

影響を受ける地域がない、または指定された地域のニュースがあることを期待しています。しかし、私はそれらのどれも得ません。

クエリを印刷すると、次のようになります。

SELECT "chimere_news"."id", "chimere_news"."title", 
       "chimere_news"."available","chimere_news"."date", "chimere_news"."content",
       COUNT("chimere_news_areas"."area_id") AS "areas__count"
FROM "chimere_news"
LEFT OUTER JOIN "chimere_news_areas" ON ("chimere_news"."id" = "chimere_news_areas"."news_id")
LEFT OUTER JOIN "chimere_news_areas" T4 ON ("chimere_news"."id" = T4."news_id")
WHERE ("chimere_news"."available" = True  AND (T4."area_id" = 1 ))
GROUP BY "chimere_news"."id", "chimere_news"."title", "chimere_news"."available", 
"chimere_news"."date", "chimere_news"."content"
HAVING COUNT("chimere_news_areas"."area_id") = 0

私は何か間違ったことをしていますか、それとも Django のバグですか?

4

1 に答える 1

1

ゼロと比較するカウントのみが必要な場合は、isnull代わりに使用してみてください。

if area:                                                                      
    news = news.filter(Q(areas__isnull=True)|Q(areas=area))
于 2012-10-10T22:45:21.250 に答える