Per quanto ne so, non c'è modo di specificare l'ordinamento lato database in questo modo in quanto sarebbe troppo specifico per il back-end. Si potrebbe desiderare di ricorrere a buon Python smistamento vecchio stile:
class Foo(models.Model):
name = models.CharField(max_length=128)
Foo.objects.create(name='a10')
Foo.objects.create(name='a1')
Foo.objects.create(name='a2')
ordered = sorted(Foo.objects.all(), key=lambda n: (n[0], int(n[1:])))
print ordered # yields a1, a2, 10
Se vi trovate a dover questo tipo di ordinamento di un sacco, mi consiglia di fare una sottoclasse personalizzata models.Manager
per il modello che esegue l'ordine. Qualcosa di simile:
class FooManager(models.Manager):
def in_a_number_order(self, *args, **kwargs):
qs = self.get_query_set().filter(*args, **kwargs)
return sorted(qs, key=lambda n: (n[0], int(n[1:])))
class Foo(models.Model):
... as before ...
objects = FooManager()
print Foo.objects.in_a_number_order()
print Foo.objects.in_a_number_order(id__in=[5, 4, 3]) # or any filtering expression
fonte
2009-05-19 16:03:55
Spot on! Risposta meravigliosa, grazie! –
Viene visualizzato questo errore durante il tentativo di questo metodo:: \t L'oggetto 'Modello' non è indicizzabile – ninja123
Does 'sorted' restituisce un set di query? Dato che è passato un queryset, lo penserei, ma penso che potrebbe anche essere convertito in un elenco o qualcosa internamente per l'ordinamento, quindi * che * viene restituito. –