Czy istnieje sposób na paginację rawqueryset przy użyciu wbudowanej paginacji Django? kiedy rzutuję go na listę, powoduje to błąd na mojej twarzy ... TypeError: oczekiwany ciąg znaków lub obiekt Unicode, znaleziono NoneType. Czy istnieje sposób obejścia tego?Paginacja django i RawQuerySet
Odpowiedz
udało mi się to osiągnąć stosując następujący:
paginator = Paginator(files, 12)
paginator._count = len(list(files))
Kod w django.core.paginator.py:
- sprawdza dostępność czy _count jest ustawiony
- jeśli nie spróbuje uruchomić .count(), który nie istnieje
- jeśli nie, to spróbuje zwykłego len
len na raw_queryset nie działa ale konwersja rzeczywisty obiekt paginator do listy prac znaleźć dla mnie w Django 1.3
można ustawić ręcznie liczyć atrybut dla obiektu RawQuerySet:
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
dla @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 szuka metody 'count()'. Zatem ustawienie właściwości 'count' nie działa. – Rockallite
Dlaczego, testowałeś to? Oczywiście, to hack, ale użyłem go. Mam na myśli to, że w Pythonie można zastąpić jedną metodę drugą. –
Rockallite, dodałem kod, aby zilustrować, jak działa ten hack –
qs.filter(**pfilter).distinct().extra(select={'test': 'COALESCE(`psearch_program`.`eu_price`, 999999999)'}).extra(order_by=['test'])
-1: wyjaśnij, co się robi, z czym jest kompatybilność z itp. –
- 1. Django leniwy QuerySet i paginacja
- 2. MySQL WHERE, LIMIT i paginacja
- 3. Paginacja CakePHP i parametry get
- 4. Mongoid paginacja
- 5. Paginacja Django - przykład z dokumentacji. Jak wyświetlić wszystkie numery witryn?
- 6. paginacja AJAX z CodeIgniter i jQuery
- 7. Paginacja za pomocą Doctrine i ZF2
- 8. Kolba SQLAlchemy błąd paginacja
- 9. Paginacja z MongoDB
- 10. paginacja w playframework
- 11. Kątowanie stronicowania a paginacja
- 12. Miesiąc paginacja z Kaminari
- 13. Paginacja w Grails
- 14. Paginacja z gałązką
- 15. Paginacja w CouchDB?
- 16. paginacja paginacji wyników wyszukiwania
- 17. JSF, RichFaces, paginacja
- 18. Kolba mongoengine paginacja
- 19. Swift tableView Paginacja
- 20. Ajax paginacja jak Twitter
- 21. Paginacja w Backbone.js
- 22. laravel 5 - Podręcznik paginacja
- 23. Ciągła paginacja z LongListSelector
- 24. Dynamiczna paginacja PHP Bez SQL
- 25. paginacja z modułem cmd Pythona
- 26. Paginacja/Nieskończone przewijanie z Firebase
- 27. Magento: paginacja filtrowana kolekcja produktów
- 28. Firebase paginacja android z recyclerview
- 29. Paginacja w DataList nie działa
- 30. Paginacja w kanałach takich jak ATOM i RSS?
Oczywiście DŁ (lista (pliki)) jest bardzo nieefektywne pamięci dla dużych surowych zbiorów zapytań. Biorąc pod uwagę, że uruchomiłeś zapytanie, możesz zamiast tego uruchomić inne zapytanie z COUNT (*) i przypisać je do paginator._count, o ile liczba wyników nie zmieni się między poszczególnymi zapytaniami. Alternatywnie różne systemy DBMS mają sposoby na umieszczenie całkowitej liczby wierszy w każdym wierszu zapytania, jeśli wyniki zapytania ulegają ciągłym zmianom. – Chris
Niestety, [RawQuerySet .__ getitem__()] (https://code.djangoproject.com/browser/django/trunk/django/db/models/query.py?rev=17381#L1517) lista wywołań (self) mimo to - więc zostanie całkowicie załadowany do pamięci, gdy tylko nazwiesz 'paginator.get_page()'. Aby tego uniknąć, myślę, że powinieneś podklasować RawQuerySet i upewnić się, że twój surowy SQL ma LIMIT/OFFSET - a nawet wtedy stracisz pamięć podręczną wyniku normalnego zestawu zapytań, więc dwukrotnie uzyskasz dostęp do qs [0] trafi dwukrotnie w DB. – AdamKG
Tak, uderzy dwa razy. Właśnie to odkryłem dla siebie. Najlepiej napisać BARDZO wydajny sql dla tego surowego zapytania i zamiast przekazywać surowy zestaw zapytań do len (list()) i do paginatora najpierw oceniasz zestaw zapytań, wykonując pętlę nad nim. Podobnie jak l = [pozycja dla pozycji w zapytaniu], a następnie przekazać ją l zarówno do paginatora, jak i len (l). To daje tylko jedno połączenie z bazą danych. –