[Python] Django QuerySets order_by

Paolo Leggio paolo a digitalmonkeys.it
Gio 2 Ott 2014 20:04:19 CEST


Salve a tutti,

vi spiego  un problema riscontrato in fase di ordinamento , aiutatemi a capire...


Prendo un modello django

class Work(models.Model):
	shootingDate = models.DateField(null=True, blank=True,editable=True)
	…..
	…..


Di seguito userò values_list(‘pk’ , flat=True) per facilita di lettura, ma rimuovendolo il problema persiste.


QuerySet per ottenere tutti gli oggetti  

>>> print Work.objects.all().values_list('pk',flat=True).query
SELECT "main_work"."id" FROM “main_work"

>>> Work.objects.all().values_list('pk',flat=True)
[18, 32, 33, 8, 4, 23, 19, 9, 20, 10, 11, 16, 15, 24, 27, 26, 17, 21, 34, 25, '...(remaining elements truncated)…']


Se prendo i prim 5 il risultato che ottengo equivale a quello atteso. ossia
 
>>> Work.objects.all().values_list('id',flat=True)[0:5]
[18, 32, 33, 8, 4]





Applicando invece un ordinamento, sorgono i miei problemi:

ordino la QuerySet per “-shootingDate”
>>> print Work.objects.all().order_by('-shootingDate').values_list('id',flat=True).query
SELECT "main_work"."id" FROM "main_work" ORDER BY "main_work"."shootingDate” DESC

>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)
[31, 32, 33, 23, 19, 20, 24, 26, 17, 21, 25, 22, 30, 29, 18, 13, 11, 12, 4, 14, '...(remaining elements truncated)...']

Chiedendo i primi 5 elementi e  questo e’ il risultato:
>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)[0:5]
[23, 33, 32, 18, 19]

io mi aspettavo [31,32,33,23,19]

Se ne chiedo 10  l’ordine cambia ancora.
>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)[0:10]
[17, 33, 24, 26, 23, 19, 32, 20, 18, 21]



Questo e' problema mi si e’ presentato  in una class Paginator che eseguiva questo metodo:

    def get_slice(self, limit, offset):
        """
        Slices the result set to the specified ``limit`` & ``offset``.
        """
        if limit == 0:
            return self.objects[offset:]
        return self.objects[offset:offset + limit]

poi provando da shell ho replicato il problema.



La cosa strana e’ che se invece accedo agli oggetti richiesti alla QuerySet anche con un semplice print, il problema svanisce e il risultato dell’operazione di slice restituisce il risultato aspettato .
Ovviamente questo vorrei evitarlo:

>>> sorted_objects = Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)
>>> sorted_objects
[31, 32, 33, 23, 19, 20, 24, 26, 17, 21, 25, 22, 30, 29, 18, 13, 11, 12, 4, 14, '...(remaining elements truncated)...']
>>> sorted_objects[0:5]
[23, 33, 32, 18, 19]
>>> print [id for id in sorted_objects]
[31, 32, 33, 23, 19, 20, 24, 26, 17, 21, 25, 22, 30, 29, 18, 13, 11, 12, 4, 14, 15, 16, 34, 5, 35, 36, 8, 7, 6, 3, 10, 9, 28, 27]
>>> sorted_objects[0:5]
[31, 32, 33, 23, 19]
>>> 



Tutto questo su 

DB e’ postgres 9.3
Django 1.6.6
python 2.7.8



C’e’ qualcosa che non tengo in considerazione?
Succede solo a me o qualcun’altra riesce a replicare il problema?

Saluti

---
Paolo Leggio 
Cel. +39.349.3420555 | Tel. +39.02.87244015  
www.digitalmonkeys.it | paolo a digitalmonkeys.it









-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141002/a318e666/attachment.html>


Maggiori informazioni sulla lista Python