使用djang中的regex按指定字段获取排序的queryset

2024-09-29 01:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下经理职位:

class NullIf(Func):
template = "NULLIF(%(expressions)s, '')"

class MySiteManager(models.Manager):

def get_queryset(self):
    qws = MySiteQuerySet(self.model, using=self._db).filter(
        some_id=settings.BASE_SOME_ID).annotate(
            # This is made for sorting by short labels as by numeric values
            short_label_numeric=Cast(
                NullIf(Func(
                    F('short_label'),
                    Value('^(\D+)|(\w+)'),
                    Value(''),
                    Value('g'),
                    function='regexp_replace')),
                models.BigIntegerField())
            ).order_by('short_label_numeric', 'short_label')

    for q in qws:
        print(q.short_label, end='\n')

    return qws

打印值的输出如下所示:

1 10 100 101 102 103 104 105 106 107 108 109 11 110 111 112 113 114 115 116 117 118 119 12 120 121 122 123 124 125 126 127 128 129 13 130 131 132 133 134 135 136 137 138 139 14 140 141 142 143 144 145 146 147 148 149 15 150 151 152 153 154 155 156 157 158 159 16 17 18 19 20 200摄氏度 21 22 23 24 25 26 260 261 262 263 264 265英尺 266英尺 267摄氏度 268摄氏度 269摄氏度 27 273摄氏度 274摄氏度 275摄氏度 276摄氏度 28 29 2摄氏度 30 302 31 32摄氏度 33摄氏度 34 35摄氏度 36 37 38 3摄氏度 4 5 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 524 6 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 7 701 702 703 704 705 706 707 708 709 710 8 801 802 803 804 805 806 807 808 809 810 9 901 902 S1 S10 第11节 第12节 第13节 第十四条 第15节 第16节 第17节 第18节 第19节 S2 二十 S3 S4 S5 S6 S7 S8号 第9章

我的问题是: 如何构建输出类似于1 2 3 3c 4 5 6 6c的查询集。。。264 265fs 266fs 267c 268c 269c。。。S1 S2 S3 S4???有人有什么假设吗?在


Tags: selfforbyvaluemodelslabelclassshort
2条回答

如何使用natural sort对输出进行排序:

import re
_nsre = re.compile(r'(\d+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]

s = "1 10 2 100 101 102 103 104 105 106 107 108 109 11 110 111 112 113 114 115 116 117 118 119 12 120 121 122 123 124 125 126 127 128 129 13 130 131 132 133 134 135 136 137 138 139 14 140 141 142 143 144 145 146 147 148 149 15 150 151 152 153 154 155 156 157 158 159 16 17 18 19 20 200c 21 22 23 24 25 26 260 261 262 263 264 265fs 266fs 267c 268c 269c 27 273c 274c 275c 276c 28 29 2c 30 302 31 32c 33c 34 35c 36 37 38 3c 4 5 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 524 6 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 7 701 702 703 704 705 706 707 708 709 710 8 801 802 803 804 805 806 807 808 809 810 9 901 902 S1 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S2 S20 S3 S4 S5 S6 S7 S8 S9"
list1 = s.split(' ')
list1.sort(key=natural_sort_key)

输出list1

^{pr2}$

主要思想是按数字顺序排列,然后按字符部分标签排序,我无法复制和测试,但解决方案可能如下所示:

首先,sql:

SELECT 
  (regexp_matches(short_label, '^\d+'))[1]::numeric AS ln,
  regexp_matches(short_label, '^\D+') as ls,
  short_label
FROM YOUR_APP_TABLENAME ORDER BY 1, 2, 3;

orm中的注释:

对于第一个sql条件,我创建custom Func

^{pr2}$

希望它能帮上忙

相关问题 更多 >