Упорядочивание набора запросов по строке модели

Я определяю строку для модели следующим образом:

class Customer(models.Model):

    company_name = ...
    first_name = ...
    last_name = ...

    def __str__(self):

        if self.company_name != None and self.company_name != "":
            return self.company_name
        else:
            return self.first_name + " " + self.last_name
    

При запросе клиентов можно ли упорядочить запрос по строке, которая представляет экземпляр модели?

eg c = Customers.objects.all().order_by('???????')

Спасибо!

Вы можете использовать аннотации для генерации той же строки, что и ваш метод __str__ в кверисете, затем вы можете упорядочить по этой аннотации.

Concat можно использовать для объединения first_name и last_name в одно поле

Coalesce вернет первое ненулевое значение, которое можно использовать для реализации if/else

from django.db.models import Value
from django.db.models.functions import Coalesce, Concat

Customer.objects.annotate(
    full_name=Concat('first_name', Value(' '), 'last_name')
).annotate(
    display_str=Coalesce('company_name', 'full_name')
).order_by('display_str')
Вернуться на верх