it-swarm.com.ru

django - преобразовать список обратно в набор запросов

У меня есть несколько записей, которые я хотел бы отсортировать на основе вычисленного значения. Получил ответ здесь ... вот так:

sorted(Profile.objects.all(), key=lambda p: p.reputation)

в классе профиля, как это:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

К сожалению, универсальное представление ожидает объект queryset и выдает ошибку, если я дам ему список.

Есть ли способ сделать это, который возвращает набор запросов

или же...

Можно ли каким-то образом преобразовать список в набор запросов? Не удалось найти ничего подобного в документах Django.

Я надеюсь не денормализовать данные, но, думаю, сделаю это, если придется.

Обновление/Ответ:

кажется, что единственный способ вернуть набор запросов - это если вы можете передать всю свою логику в SQL-запросы.

Когда это невозможно, (я думаю) вам нужно денормализовать данные

51
Jiaaro

Нет смысла преобразовывать список данных обратно в запрос. Объект запроса никогда не содержит данных; это просто представляет запрос к базе данных. Если бы вы создали свой список для запроса, ему пришлось бы снова получать все, и это было бы излишним и очень плохим с точки зрения производительности.

Что ты можешь сделать:

  • Опишите, как вычисляется поле reputation; возможно, можно как-то упорядочить данные в базе данных.
  • Измените представление, чтобы не требовать объекта запроса. Если необходимо выполнить дополнительную фильтрацию и т.д., Это следует сделать перед любым упорядочением, поскольку упорядочение займет меньше времени при меньшем количестве записей (и из базы данных будет извлечено меньше данных). Таким образом, вы можете отправить отфильтрованный объект запроса в сортировку. функционировать непосредственно перед отправкой его в шаблон (который не должен заботиться о том, является ли это запросом или списком).
21
Blixt

Хорошо ... этот пост уже устарел, НО вы можете получить все ids объектов в вашем списке, а затем выполнить model.objects.filter(pk__in=list_of_ids)

86
neolaser