django - преобразовать список обратно в набор запросов [дублировать]
-
21-08-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
У меня есть несколько записей, которые я хотел бы отсортировать на основе вычисленного значения.Получил ответ сюда , сюда...вот так:
sorted(Profile.objects.all(), key=lambda p: p.reputation)
в профильном классе, подобном этому:
class Profile(models.Model):
...
@property
def reputation(self):
...
К сожалению, общее представление ожидает объект queryset и выдает ошибку, если я предоставляю ему список.
Есть ли способ сделать это, который возвращает набор запросов
или...
Могу ли я каким-то образом преобразовать список в набор запросов? Не удалось найти ничего подобного в документах django.
Я надеюсь не денормализовывать данные, но, думаю, я сделаю это, если придется.
Обновление / Ответ:
похоже, что единственный способ вернуть набор запросов - это если вы сможете включить всю свою логику в sql-запросы.
Когда это невозможно, (я думаю) вам нужно денормализовать данные
Решение
Нет смысла преобразовывать список данных обратно в запрос.Объект запроса никогда не содержит данных;он просто представляет собой запрос к базе данных.Ему пришлось бы извлекать все снова, если бы вы внесли свой список в запрос, а это было бы избыточно и очень негативно сказалось бы на производительности.
Что вы можете сделать:
- Опишите, как
reputation
поле вычисляется;вероятно, можно каким-то образом упорядочить данные в базе данных. - Измените представление так, чтобы для него не требовался объект запроса.Если для этого нужно выполнить дополнительную фильтрацию и т.д.это следует делать перед любым оформлением заказа, поскольку оформление заказа займет меньше времени при меньшем количестве записей (и из базы данных будет извлечено меньше данных). Таким образом, вы могли бы отправить отфильтрованный объект запроса в функцию сортировки непосредственно перед отправкой его в шаблон (для которого не должно иметь значения, является ли это запросом или списком).)
Другие советы
Хорошо ... теперь этот пост устарел, но что вы могли бы сделать, так это получить все ids
из объектов в вашем списке, затем выполните model.objects.filter(pk__in=list_of_ids)