Итак, я пытаюсь добавить временный атрибут к двум отдельным QuerySets из той же модели, но кажется, что как только я попытаюсь объединить их вместе, новые поля исчезнут ,Как добавить временный атрибут в Querysets Django, а затем слить
Пример:
class IndexView(View):
def get(self, request):
q1 = MyModel.objects.filter(points=0)
q2 = MyModel.objects.filter(points=100)
for q in q1:
q.title = 'Loser'
print(q.title) # Prints 'Loser'
for q in q2:
q.title = 'Winner'
print(q.title) # Prints 'Winner'
q = q1 | q2 # Merges the two QuerySets together
for item in q:
print(item.title) # ERROR: "Title" is not a field anymore apparently...
return render(request, 'index.html', {})
Я попробовал другой подход, который использует .chain()
(упомянутый в другом потоке), но изменяет тип от QuerySet
к List
, которые я не хочу. Я отправлю его ниже. Есть ли способ сохранить список как QuerySet при достижении тех же результатов? Обратите внимание, что я хочу, чтобы атрибут title
был временным, поэтому я могу разделить элементы в шаблоне. Фильтр points
не является фактическим фильтром и на самом деле намного сложнее, поэтому теги шаблонов и методы модели не являются опцией.
from itertools import chain
feed = sorted(
chain(q1, q2),
key=lambda instance: instance.created)
Django v1.9.6
Python v3.4.3
'q = q1 | Создает новый набор запросов, который выберет объединение «q1» и «q2». Когда вы переходите через 'q', вы запускаете новый запрос и снова загружаете объекты из базы данных. – spectras
Интересно - так есть альтернативный подход, который позволит избежать очистки временных атрибутов, которые я определил? – Hybrid
В идеале вы должны добавить эти атрибуты как часть самого запроса, используя 'annotate', возможно, с предложением' Case'. Вам даже не нужны два запроса и слияние, просто объясните базу данных, как рассчитать поле самостоятельно. – spectras