这个线程中的所有答案对我来说都不起作用,因为它们假定是数字文本。我找到了一个适用于一部分情况的解决方案。考虑这个模型
Class Block(models.Model):
title = models.CharField()
假设我有一些字段,有时会有前导字符和尾数数字。如果我尝试正常排序
>>> Block.objects.all().order_by('title')
<QuerySet [<Block: 1>, <Block: 10>, <Block: 15>, <Block: 2>, <Block: N1>, <Block: N12>, <Block: N4>]>
正如所预期的那样,按字母顺序排列是正确的,但对我们人类来说毫无意义。我为这个特定的用例使用的技巧是将找到的任何文本替换为数字9999,然后将该值强制转换为整数并按其排序。
对于大多数具有前导字符的情况,这将获得所需的结果。请参见下面的内容。
from django.db.models.expressions import RawSQL
>>> Block.objects.all()\
.annotate(my_faux_integer=RawSQL("CAST(regexp_replace(title, '[A-Z]+', '9999', 'g') AS INTEGER)", ''))\
.order_by('my_faux_integer', 'title')
<QuerySet [<Block: 1>, <Block: 2>, <Block: 10>, <Block: 15>, <Block: N1>, <Block: N4>, <Block: N12>]>