如何在Django中定义特定顺序QuerySet?
QuerySet
具体来说,如果我有QuerySet这样的话:['a10', 'a1', 'a2']。
['a10', 'a1', 'a2']
我正在寻找以下商品时,按常规订购(使用Whatever.objects.order_by('someField'))会给我。['a1', 'a10', 'a2']['a1', 'a2', 'a10']
Whatever.objects.order_by('someField')
['a1', 'a10', 'a2']['a1', 'a2', 'a10']
定义自己的订购技术的正确方法是什么?
据我所知,没有办法以这种方式指定数据库端的排序,因为它过于特定于后端。你可能希望采用老式的Python排序:
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
如果你发现自己非常需要这种排序,那么建议models.Manager你为执行排序的模型制作一个自定义子类。就像是:
models.Manager
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