Concat str为3位数

时间:2016-06-18 06:20:34

标签: python django sorting concatenation

尝试实现的是对changelist_view中的列进行排序。该列由001-001-001或001-001-A-001类型的数字组成。用于@property方法从几个模型的整数字段构建这些数字。

现在,排序非常麻烦。经过对这个网站的研究/ django docs遇到了annotate方法,具有条件和Concat功能。这是有效的(消除了下面代码中的%03d)并进行排序,但不是3位数字,而是以1-1-1或900-1-A-1类型的数字产生。这不是目标排序。

将其转换为三位数会产生错误:'%d格式:需要一个数字,而不是str'

是否可以将单独的字段转换为三位数并实现排序?

def get_queryset(self, request):
    q = Asset.objects.annotate(
        annotated_value=Case(
            When(subcategory__number__isnull=False, 
                then=Concat(
                '%03d' % ('subcategory__category__parent__number'),
                '%03d' % ('subcategory__category__number'), 
                'subcategory__number', 
                '%03d' % ('number'),
                )
            ),
            When(subcategory__number__isnull=True, 
                then=Concat(
                    '%03d' % ('category__parent__number'), 
                    '%03d' % ('category__number'), 
                    '%03d' % ('number')
                    )
                ),
            output_field=CharField(),
            )
        )
    return q

1 个答案:

答案 0 :(得分:0)

再次感谢solarissmoke。没有重组模型,但确实得出结论我走了错误的路径与get_queryset。使用列表过滤器解决了这个问题,尽管没有列排序,但它完全符合要求。

class AssetListFilter(admin.SimpleListFilter):

title = 'Asset'
parameter_name = 'asset'

def lookups(self, request, model_admin):

    q = []

    for asset in Asset.objects.all():
        if asset.subcategory:
            q.append(
                (
                    str(asset.id),
                    '%03d-%03d-%s-%03d - %s' % (
                        asset.subcategory.category.parent.number, 
                        asset.subcategory.category.number, 
                        asset.subcategory.number, 
                        asset.number, 
                        asset.full_name
                        )
                    )
                )
        else:
            q.append(
                (
                    str(asset.id),
                    '%03d-%03d-%03d - %s' % (
                        asset.category.parent.number, 
                        asset.category.number, 
                        asset.number, 
                        asset.full_name
                    )
                )
            )

    list = sorted(q, key=lambda x: x[1])
    return list
    print(q)

def queryset(self, request, queryset):

    q = Q()
    if self.value() is not None:
        q = Q(asset__id=int(self.value()))
    return queryset.filter(q)