django 如何使用admin.display装饰器按两列对结果进行排序

hlswsv35  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(104)

请考虑以下示例:

# models.py

class Case(models.Model):
    number = models.SmallIntegerField(null=False, blank=False)
    year = models.SmallIntegerField(null=False, blank=False)
    ...
#admin.py
@admin.register(Case)
class CaseAdmin(admin.ModelAdmin):
    list_display = ['case_number', ...]
    ordering = ['-year', '-number']

    @admin.display(ordering=['-year', '-number'])
    def case_number(self, case):
        return f'{case.number} / {case.year}'

现在,如何使用admin.display()装饰器指定'-year''-number'的顺序?
如果不能用admin.display()装饰器完成,有没有其他方法可以实现?
谢谢

gab6jxml

gab6jxml1#

这是可能的,但它是一个非常缓慢的链接here
Django**order_by()**使用model字段查询方法订单记录

在这里,我添加了一种替代方法。正在使用**save()**方法重写,请检查此处...

models.py

class Case(models.Model):
    number = models.SmallIntegerField(null=False, blank=False)
    year = models.SmallIntegerField(null=False, blank=False)
    case_number = models.PositiveIntegerField(null=True, blank=True)
    
    def save(self, *args, **kwargs):
        self.case_number = int(f"{self.number}{self.year}")
        super(Case, self).save(*args, **kwargs)

admin.py

@admin.register(Case)
class CaseAdmin(admin.ModelAdmin):
    list_display = ("case_number", "year", "number", "id")[::-1]
    ordering = ['-case_number']

浏览器输出

注意-此处需要添加一个额外字段以保存**case_number,但使用case_number**排序记录是更好的方法
mec1mxoz

mec1mxoz2#

感谢@Willem货车Onsem为您提供的patch,以便使此成为可能。
即使开发商不同意实施它。感谢您花时间修补它并打开#34646票证。

相关问题