Как я могу добавить настраиваемое поле в queryset и отсортировать - PullRequest
0 голосов
/ 13 марта 2019

У меня есть модель Product, а в моих продуктах нет полей available_quantity и prices, поскольку эти поля находятся в другом сервисе. Поэтому я добавил настраиваемое поле в свой набор запросов.

Это мой код;

for product in queryset:
    product.info_bundle = {
        'available_quantity': stock_info.get(product.stock_code),
        'prices': 100,
    }

Я добавил свое пользовательское поле info_bundle в набор запросов.

Проблема есть; Я не могу заказать с queryset.order_by(‘avaliable_quantity’), потому что я добавил это. Он не приходит из базы данных, поэтому SQL не может найти поле.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы не можете сортировать на уровне БД с полем, которое вы получаете от стороннего сервиса. Для ваших требований, вам нужно будет отсортировать в памяти. Но, как вы предложили, когда вы делаете это, вы конвертируете набор запросов в список. Если я правильно понял, вы используете DRF и выполняете эту сортировку в методе get_queryset. Итак, на ум приходят следующие методы:

  1. (Временное решение) Возвращает список из метода get_queryset, но переопределяет другие методы представления, которые используют метод get_queryset, и заставляет их работать со списками вместо наборов запросов
  2. (Временное решение) Не выполняйте сортировку в методе get_queryset, но переопределите метод list и сортируйте результаты в памяти перед возвратом ответа.
  3. Используйте пользовательский фильтр заказа в вашем представлении. Другие 2 - обходные пути, но при таком подходе может оказаться возможным создать решение, которое будет соответствовать общему потоку DRF. Здесь вы можете столкнуться с той же проблемой, поскольку при сортировке вы будете преобразовывать набор запросов в список.
0 голосов
/ 13 марта 2019

Вы не можете сделать это.

order_by() выполняется на уровне БД и работает только на дБполя или аннотированные поля .

Подобная проблема также упоминается в сообщении SO, Фильтрация модели Djangoсвойство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...