質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5404閲覧

djangoのクエリでcountとlimitをする方法

Mcgregor

総合スコア31

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2020/04/18 17:29

編集2020/04/18 19:22

お世話になっております。
djangoでクエリセットを記載していたのですが期待した動作がされません。
ご教示いただければと思います。

以下のテーブル/レコードが存在します。
table_A

keydateresult
12020-03-29 21:18:00100
22020-03-29 21:19:00100
32020-03-29 21:20:00100
12020-03-29 21:21:00110
22020-03-29 21:22:00100
12020-03-29 21:23:00120
12020-03-29 21:24:00100
以下時間が違うレコード

この時に以下の様な結果を得たいと思っています。
1.keyが"1"の物のみを抽出する。
2.dateでOrder_byで最新のレコードを10取り出す。
3.resultをcountでそれぞれが何個あるか取り出したい。

以下はSQLで表現した場合です。

SQL

1select result, count(result) 2 from ( 3 select result from table_A 4    where key = 1 limit 10) as q1 5; 6 7結果 8100 6 9110 3 10120 1

これをdjangoのクエリで以下の様に記載しました。

Python

1views.py 2 all = table_A.objects.all().filter(key=1).order_by('-date')[:10] 3 count = all.values('result').annotate(total=Count('result')) 4params = { 5 'data': count, 6} 7

html

1index.html 2 {% for i in data %} 3 {{i.result}} 4 {{i.total}} 5 {% endfor %}

ですが、この結果がkey=1の物のみ取得はできているようですが、
100 1
100 1
110 1
120 1
〜〜〜
という風に集計されず、期待した表示がされません。
お手数おかけしますが、御助力お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

興味があったので調べてみました。
スライスしたクエリセットを集計しても、スライスしていない全体で集計されるようです。
Issuesで対応したのかを追うことができませんでした。

Django queryset: aggregate after slicing the queryset doesn't work
: stack overflow

.aggregate() does not honour sliced queryset : Django Issues

以下のようにすれば、できそうです。

python

1items = table_A.objects.all().filter(key=1).order_by('-date')[:10] 2count = table_A.objects.filter(pk__in=items).values('result').annotate(total=Count('result'))

投稿2020/04/19 02:36

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mcgregor

2020/04/19 11:34

ご助言ありがとうございます。 特にいただいた上記のコードに修正したところエラーは出ず、クエリが動作している様に見えました。 ですが、今度はtemplateファイル(index.html)で呼び出そうとすると、エラーが出るという事態に陥ってしまいました。 {% for i in data %} {{i.result}} {{i.total}} {% endfor %} 上記の記述で出力できると思ったのですが、行頭でエラーが出ています。 いただいたリンクも読んでみたのですが、これに関する記述は無さそうで、 もしお分かりでしたら重ねてで申し訳ありませんが、またご助言いただければと思います。
hasami

2020/04/19 11:57

manage.py shellで望んでいる動作か確認してみてください。 テンプレートの問題であれば、別質問でお願いします。
Mcgregor

2020/04/19 11:59

了解しました。 shellで動作を確認してみます。 本件のアドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問