2016-05-25 1 views
0

Итак, я пытаюсь добавить временный атрибут к двум отдельным 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.6Python v3.4.3

+3

'q = q1 | Создает новый набор запросов, который выберет объединение «q1» и «q2». Когда вы переходите через 'q', вы запускаете новый запрос и снова загружаете объекты из базы данных. – spectras

+0

Интересно - так есть альтернативный подход, который позволит избежать очистки временных атрибутов, которые я определил? – Hybrid

+1

В идеале вы должны добавить эти атрибуты как часть самого запроса, используя 'annotate', возможно, с предложением' Case'. Вам даже не нужны два запроса и слияние, просто объясните базу данных, как рассчитать поле самостоятельно. – spectras

ответ

0

Там нет никакого способа, вы можете сделать это, потому что когда вы делаете:

q = q1 | q2 

Вы были выполнение нового запроса к базе данных. Там нет простого способа для этого, вы можете запросить их все только вместе пометьте затем соответственно:

queryset = MyModel.objects.filter(Q(points=0) | Q(points=100)) 
for item in queryset: 
    if q.points == 0: 
     q.title = 'Loser' 
    elif q.points == 100: 
     q.title = 'Winner' 

Учитывая, что вы могли бы усложнили условия о points, можно также создать метод для модели MyModel затем вызвать эту функцию возвратите значение, подобное назначению title.

+0

Можете ли вы также рассказать мне, почему вы не хотите конвертировать их в списки? Вы уже зациклились на них, поэтому нет никакой реальной выгоды, чтобы держать его в качестве набора запросов, верно? –

+0

Moreso в случае необходимости использования фильтров или templatetags в будущем, которым может потребоваться доступ к методам QuerySet. – Hybrid

+0

Затем сделайте фильтры в представлениях настолько, насколько сможете, вместо templatetags и преобразуйте их в список.Я по-прежнему считаю, что шаблон может получить окончательные данные, если вы обрабатываете все в методе views.py. –

 Смежные вопросы

  • Нет связанных вопросов^_^