django - преобразовать список обратно в набор запросов [дублировать]

StackOverflow https://stackoverflow.com/questions/1058135

Вопрос

На этот вопрос уже есть ответ здесь:

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

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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top