此线程中的所有答案都对我不起作用,因为它们假设为数字文本。我找到了一个适用于部分案例的解决方案。考虑这个模型
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>]>