Django - Как отсортировать выборку по длине двух объединенных полей - PullRequest
0 голосов
/ 24 февраля 2020

Я использую Django 3.0 Это моя модель:

class StoreIdentification(models.Model):
store = models.ForeignKey(Store, blank=True, on_delete=models.CASCADE, default=None)
description_1_text = models.CharField(max_length=48, null=True, blank=True, default=None)
description_2_text = models.CharField(max_length=48, null=True, blank=True, default=None)

def __str__(self):
    return f'{self.store.name} - {self.description_1_text} + {self.description_2_text}'

У меня есть выбор, где мне нужно отсортировать на основе длины объединенного текста обоих description_1_text и description_2_text. Я могу сделать каждый из них в отдельности, все мои попытки провалились. Вот некоторые попытки:

def identify(request):
identifiers = StoreIdentification.objects.all().extra(
    select={'char_num': 'Length(description_2_text)' + 'Length(description_1_text)'}
).order_by('-char_num')


for identifier in identifiers:
    # Do something ...

Этот возвращает ошибку рядом с длиной (django .db.utils.OperationalError: вблизи "Длина": синтаксическая ошибка)

Другой try:

    identifiers = StoreIdentification.objects.all().order_by(
    Length('description_1_text' + 'description_2_text').desc())

Этот объединяет description_1_text и description_2_text до их разрешения.

Try # 3:

    identifiers = StoreIdentification.objects.all().extra(
    select={'char_num': 'Length(description_2_text) + Length(description_1_text)'}
).order_by('-char_num')

Последняя попытка просто проигнорировала Length ( description_1_text) и заказывается только на основе description_2_text. У меня было несколько других попыток, все закончилось так же ... с некоторой ошибкой.

Есть предложения?

...