1

Please consider the following example:

# 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}'

Now how can I specify the order to be by '-year' and '-number' using the admin.display() decorator?

If it can not be done with the admin.display() decorator, is there another way to achieve that?

Thanks

DeaDSouL
  • 220
  • 2
  • 9

2 Answers2

0

it's possible but it's a very slow link here

Django order_by() query method order records using model field

Here I added an alternative way for it. using save() method overriding please check here...

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']

Browser Output

enter image description here

NOTE - here you need to add one extra field for saving case_number but, it's a better way to order records using case_number

  • Nice trick, although the data will be redundant.. yet it's better than the given link. – DeaDSouL Jun 08 '23 at 11:45
  • I do like it, but I don't think it's ideal because of the data redundant. (which I don't want & need in db). So, I'll wait till ordering by multi fields are implemented/supported in the `admin.display` decorator. – DeaDSouL Jun 08 '23 at 12:22
0

Thank you @Willem Van Onsem for the patch you provided in order to make this possible.

Even thought the developers didn't agree to implement it. Thank you for the time you spent patching it and opening the #34646 ticket.

DeaDSouL
  • 220
  • 2
  • 9