当前位置: 首页 > 面试题库 >

Django中的自定义排序

楚流觞
2023-03-14
问题内容

如何在Django中定义特定顺序QuerySet

具体来说,如果我有QuerySet这样的话:['a10', 'a1', 'a2']

我正在寻找以下商品时,按常规订购(使用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你为执行排序的模型制作一个自定义子类。就像是:

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


 类似资料:
  • 问题内容: 我有一个模特。带外键的汽车,例如。所有者,可以空白,也可以不空白。汽车有一个creation_date。 我想按日期订购这些汽车,但是如果汽车有所有者,则必须以所有者的出生日期代替汽车的creation_date。 这可能吗? 问题答案: 看看这个类似的问题:对查询集进行排序的好方法吗?-Django 您不能使用模型的元数据,因为它仅接受一个字段 https://docs.django

  • 问题内容: 我有这样的查询: 但是,当我打印出来时,它会自动进行1,2,3,4,5的排序。我们如何在不更改数据库结构的情况下保持顺序(2,4,1,5,3)? 谢谢! 问题答案: 我问这个: mysql按问题排序 我得到的答案和所有功劳归于他们: 您可以使用CASE运算符指定顺序: 在PHP中,你可以像这样:

  • 问题内容: 我有一个问题:这是由ElementTree库形成的列表列表。 word1..4可能包含Unicode字符,即(â,ü,ç)。 我想按我的自定义字母对列表列表进行排序。 我知道如何从这里按python中的单词对自定义字母进行排序 我也知道如何从此处http://wiki.python.org/moin/HowTo/Sorting按键排序 问题是我找不到如何应用这两种方法对“列表列表”进行

  • 有的时候我们希望排序不是仅仅按照自然顺序排序。例如,我们希望按照字符串的长度来对一个字符串数组排序而不是按照字母顺序来排序。这里我们介绍一下Go的自定义排序。 package main import "sort" import "fmt" // 为了能够使用自定义函数来排序,我们需要一个 // 对应的排序类型,比如这里我们为内置的字符串 // 数组定义了一个别名ByLength type ByLe

  • Django 自带的 User 及 auth 库为快速开发带来了很大便利,也增加了扩展其功能的难度。 Django 官方文档中是推荐使用一对一的关联 Model 来扩展 User model: class UserExtend(Model): user = OneToOneField(User, auto_create=True, relate_name='extend') fie

  • 问题内容: 我有一组显示一定数量的磁贴,具体取决于用户选择的选项。我现在想通过显示的任何数字来实现排序。 下面的代码显示了我是如何实现的(通过在父卡范围内获取/设置一个值)。现在,由于orderBy函数接受一个字符串,因此我尝试在卡范围内设置一个名为curOptionValue的变量并以此进行排序,但似乎不起作用。 因此,问题就变成了,如何创建自定义排序功能? 和控制器: 问题答案: 实际上,过滤