尝试实现的是对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
答案 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)