は、djangoの組み込みページネーションを使用してrawqueretetを改ページする方法ですか? 私はそれをリストにキャストすると、私の顔にエラーがスローされます... TypeError:期待される文字列またはUnicodeオブジェクト、NoneTypeが見つかりました。これを回避する方法はありますか?djangoのページ番号とRawQuerySet
答えて
私は、次を使用してそれを達成するために管理:
paginator = Paginator(files, 12)
paginator._count = len(list(files))
django.core.paginator.pyのコード:_countが設定されているかどうかを
- チェック存在しない.count()を実行するには
- もしそうでなければ、lenをプレーします。
は動作しませんが、リストに実際のページネータオブジェクトを変換すると、Djangoの中で私を見つける作品raw_querysetにlenの1.3
:
items = Item.objects.raw("select * from appitem_item")
def items_count():
cursor = connection.cursor()
cursor.execute("select count(*) from appitem_item")
row = cursor.fetchone()
return row[0]
items.count = items_count
@Rockallite
>>> class A():
... def b(self):
... print 'from b'
...
>>>
>>> (A()).b()
from b
>>> def c():
... print 'from c'
...
>>> a = A()
>>> a.b = c
>>> a.b()
from c
django.core.paginator.Paginatorは 'count()'メソッドを探します。したがって、 'count'プロパティの設定は機能しません。 – Rockallite
なぜ、あなたはそれを試しましたか?もちろん、それはハックですが、私はそれを使用しました。私は、Pythonでは、あるメソッドを別のものに置き換えることができるということです。 –
Rockallite、このハックの仕組みを説明するためにコードを追加しました –
qs.filter(**pfilter).distinct().extra(select={'test': 'COALESCE(`psearch_program`.`eu_price`, 999999999)'}).extra(order_by=['test'])
-1:何が行われているか、どのようなものと互換性があるかなどを説明します。 –
- 1. Django遅延クエリーセットとページ番号
- 2. ページ番号とオフセット
- 3. FacebookのAPIとページ番号
- 4. 効率的なページ番号付けとdjangoでのデータベースクエリ
- 5. Django製品番号バスケット番号
- 6. ページ番号:ハイライト現在の番号ボタン
- 7. ページごとのレコード数ページ番号
- 8. Djangoページング - ListViewとページ番号にリダイレクトする方法
- 9. Django rest frameworkはページ番号とオフセットを有効にします
- 10. Silverstripeブログアイテムとページ番号
- 11. Laravel whereステートメントとページ番号
- 12. Solrカーソルマーカーとページ番号
- 13. MDX行数とページ番号
- 14. ColdFusionページングとページ番号
- 15. Codeigniterページ番号
- 16. Wordページ番号
- 17. SSRSページ番号
- 18. HTML5ページ番号
- 19. rich:dataScrollerページ番号
- 20. ActiveResourceページ番号
- 21. Djangoモデル番号フィールド
- 22. Django:郵便番号
- 23. Django注文番号
- 24. SSRSのページ番号
- 25. ActiveReportのページ番号
- 26. mpttのページ番号
- 27. カスタムポストタイプのページ番号
- 28. ページネーションのDjango行番号
- 29. テンプレートのdjangoスライス番号
- 30. Djangoのオブジェクトのページ番号リストを反復するJS
明らかでlen(リスト(ファイル))のために非常に大きなメモリの生のクエリセットの非効率的です。実行されたクエリが分かっている場合、代わりにCOUNT(*)を使用して別のクエリを実行し、各クエリ間で結果の数が変化しない限りpaginator._countに代入することができます。 また、異なるDBMSには、クエリ結果が絶えず変化している場合に、クエリのすべての行に合計行数を埋め込む方法があります。 – Chris
残念ながら、[RawQuerySet .__ getitem__()](https://code.djangoproject.com/browser/django/trunk/django/db/models/query.py?rev=17381#L1517)コールリスト(自己)とにかく - 'paginator.get_page()'を呼び出すとすぐに完全にメモリにロードされます。これを避けるには、RawQuerySetをサブクラス化して、生のSQLにLIMIT/OFFSETがあることを確認する必要があります。通常のクエリーセットの結果キャッシュを失うことになるので、qs [0] DBに2回ヒットします。 – AdamKG
はい、2回ヒットします。私はちょうどそれ自身のためにそれを発見した。だから最善のあなたは、その生のクエリーセットのために非常に効率的なSQLを書くと、生のクエリーセットをlen(list())に渡すのではなく、ページネーターに渡してクエリーセットをルーペで評価します。 l = [querysetの項目の項目]のようにして、そのlをpaginatorとlen(l)の両方に渡します。これにより、データベース呼び出しは1つだけになります。 –