используя сортировку, сортировку или эквивалент с объектами QuerySet - PullRequest
1 голос
/ 21 марта 2012

Я хочу отсортировать результаты из наборов запросов для django по определенной структуре имен и связанных объектов. Order_by () нежизнеспособен, так как не принимает методы. Создание дополнительного столбца, который жестко кодирует желаемое имя, нецелесообразно, и это обходной путь для отсутствия функциональности.

Я подумал, что для этого нужно использовать собственный менеджер, но у меня возникли проблемы, поскольку sorted () всегда возвращает список, а django хочет, чтобы объект оставался как QuerySet. Итак, мой вопрос заключается в том, есть ли какой-нибудь достойный способ использовать sorted () в пользовательском классе (где класс - это в основном список с некоторыми дополнительными методами) и заставить его остаться в этом пользовательском классе? На самом деле это довольно общий характер, и, вероятно, он используется не только в QuerySets.

class ClientManager(models.Manager):
    def get_query_set(self):
        set = super(ClientManager,self).get_query_set()
        return sorted(set, key=lambda a: a.fullName())

Как пара баллов (и ответы на некоторые комментарии здесь):

  • Документация к аннотации, похоже, подразумевает, что она ограничена функциями агрегирования. Я бы хотел, чтобы это вместо этого выполнялось для метода.
  • Кэширование значения - слишком большой обходной путь для того, что я хотел бы сделать. Даже если это лучшее решение с некоторых точек зрения, на мой вкус оно недостаточно динамично и, по моему мнению, нарушает DRY.

Я видел много постов на эту тему, возможно, отсутствие реальных возможностей сортировки является недостатком django. Такая сортировка необходима, чтобы я мог пробраться через администратора django для множества данных, отсортированных понятным для человека способом.

Добавлен вопрос Это могло бы быть жизнеспособным решением, если бы я мог превратить список объектов в QuerySet объектов. Кто-нибудь знает, возможно ли это? В частности, преобразовать его в объект <class 'django.db.models.query.QuerySet'>.

1 Ответ

0 голосов
/ 21 марта 2012

Если у вас есть такая модель:

class YourModel(models.Model):
    # fields

    def fullName(self):
        # return the fullName

Тогда вам следует кэшировать полное имя в столбце базы данных и сохранять его свежим с помощью сигнал , как таковой:

from django.db.models import signals

class YourModel(models.Model):
    # fields

    # cointains the return value of make_fullName
    fullName = models.CharField(max_length=100)

    def make_fullName(self):
        # return the fullName

# update YourModel fullName before saving:
def update_fullName(sender, instance, **kwargs):
    instance.fullName = instance.make_fullName()
signals.pre_save.connect(update_fullName, sender=YourModel)

Затем вы можете order_by ('fullName')

...