<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Salve a tutti,<div><br></div><div>vi spiego un problema riscontrato in fase di ordinamento , aiutatemi a capire...</div><div><br></div><div><br></div><div>Prendo un modello django</div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; background-color: rgb(60, 60, 60); position: static; z-index: auto;"><div style="font-family: Helvetica; font-size: 12px;"><font color="#ebebeb">class Work(models.Model):</font></div><div style="font-family: Helvetica; font-size: 12px;"><font color="#ebebeb"><span class="Apple-tab-span" style="white-space: pre;"> </span>shootingDate = models.DateField(null=True, blank=True,editable=True)</font></div><div style="font-family: Helvetica; font-size: 12px;"><font color="#ebebeb"><span class="Apple-tab-span" style="white-space: pre;"> </span>…..</font></div><div style="font-family: Helvetica; font-size: 12px;"><font color="#ebebeb"><span class="Apple-tab-span" style="white-space: pre;"> </span>…..</font></div></div></div><div><br></div><div><br></div><div>Di seguito userò values_list(‘pk’ , flat=True) per facilita di lettura, ma rimuovendolo il problema persiste.</div><div><br></div><div><br></div><div>QuerySet per ottenere tutti gli oggetti </div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60); position: static; z-index: auto;"><div style="margin: 0px;">>>> print Work.objects.all().values_list('pk',flat=True).query</div><div style="margin: 0px;">SELECT "main_work"."id" FROM “main_work"</div><div style="margin: 0px;"><br></div></div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> Work.objects.all().values_list('pk',flat=True)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[18, 32, 33, 8, 4, 23, 19, 9, 20, 10, 11, 16, 15, 24, 27, 26, 17, 21, 34, 25, '...(remaining elements truncated)…']</div></div><div><br></div><div><br></div><div>Se prendo i prim 5 il risultato che ottengo equivale a quello atteso. ossia</div><div> </div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> Work.objects.all().values_list('id',flat=True)[0:5]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[18, 32, 33, 8, 4]</div></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>Applicando invece un ordinamento, sorgono i miei problemi:</div><div><br></div><div>ordino la QuerySet per “-shootingDate”</div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60); position: static; z-index: auto;"><div style="margin: 0px;">>>> print Work.objects.all().order_by('-shootingDate').values_list('id',flat=True).query</div><div style="margin: 0px;">SELECT "main_work"."id" FROM "main_work" ORDER BY "main_work"."shootingDate” DESC</div><div style="margin: 0px;"><br></div><div style="margin: 0px;">>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)</div><div style="margin: 0px;">[31, 32, 33, 23, 19, 20, 24, 26, 17, 21, 25, 22, 30, 29, 18, 13, 11, 12, 4, 14, '...(remaining elements truncated)...']</div></div></div><div><br></div><div>Chiedendo i primi 5 elementi e questo e’ il risultato:</div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)[0:5]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[23, 33, 32, 18, 19]</div></div><div><br></div><div>io mi aspettavo [31,32,33,23,19]</div><div><br></div><div>Se ne chiedo 10 l’ordine cambia ancora.</div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)[0:10]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[17, 33, 24, 26, 23, 19, 32, 20, 18, 21]</div></div><div><br></div><div><br></div><div><br></div><div>Questo e' problema mi si e’ presentato in una class Paginator che eseguiva questo metodo:</div><div><br></div><div><div> def get_slice(self, limit, offset):</div><div> """</div><div> Slices the result set to the specified ``limit`` & ``offset``.</div><div> """</div><div> if limit == 0:</div><div> return self.objects[offset:]</div><div> return self.objects[offset:offset + limit]</div></div><div><br></div><div>poi provando da shell ho replicato il problema.</div><div><br></div><div><br></div><div><br></div><div>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 .</div><div>Ovviamente questo vorrei evitarlo:</div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> sorted_objects = Work.objects.all().order_by('-shootingDate').values_list('id',flat=True)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> sorted_objects</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[31, 32, 33, 23, 19, 20, 24, 26, 17, 21, 25, 22, 30, 29, 18, 13, 11, 12, 4, 14, '...(remaining elements truncated)...']</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> sorted_objects[0:5]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[23, 33, 32, 18, 19]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> print [id for id in sorted_objects]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[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]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> sorted_objects[0:5]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">[31, 32, 33, 23, 19]</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);">>>> </div></div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(236, 236, 236); background-color: rgb(60, 60, 60);"><br></div><div><br></div><div><br></div><div>Tutto questo su </div><div><br></div><div>DB e’ postgres 9.3</div><div>Django 1.6.6</div><div>python 2.7.8</div><div><br></div><div><br></div><div><br></div><div>C’e’ qualcosa che non tengo in considerazione?</div><div>Succede solo a me o qualcun’altra riesce a replicare il problema?</div><div><br></div><div>Saluti</div><div><br></div><div>---<br>Paolo Leggio <br>Cel. +39.349.3420555 | Tel. +39.02.87244015 <br><a href="http://www.digitalmonkeys.it">www.digitalmonkeys.it</a> | <a href="mailto:paolo@digitalmonkeys.it">paolo@digitalmonkeys.it</a><br><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></body></html>