Django queryset If оператор никогда не оценивается как true? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть простой вид обновления.Это читает запрос POST из предыдущего представления.Эта часть прекрасно работает.

owner = ADMirror.objects.get (employeentname=request.POST.get('userpost'))

У меня есть набор запросов, определенный как:

currentlevel = QVReportAccess.objects.filter(ntname = 'owner.employeentname, active = 1).values('sr_datareduce_summary_code')

, который выглядит как:

<QuerySet [{'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_c
ode': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_sum
mary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_dataredu
ce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_da
tareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {
'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z0712
6'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code': 'Z07126'}, {'sr_datareduce_summary_code':
'Z07126'}, '...(remaining elements truncated)...']>

Набор запросов будету меня есть дубликаты для sr_datareduce_summary_code, потому что они находятся на отдельных уровнях программы в модели.

Затем у меня есть следующий оператор if, чтобы дать yes if true и no if false, но даже если набор запросов содержит Z07126 my if ifникогда не оценивается как истина.Почему это так и как мне заставить его работать правильно?

if QVReportAccess.objects.filter(ntname = owner.employeentname, active = 1).values_list('sr_datareduce_summary_code') == "Z07126":
    appaccess = 'yes'
else:
    appaccess = 'no'

print(appaccess)

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Или вы можете просто зациклить отфильтрованный набор запросов:

for obj in QVReportAccess.objects.filter(
    ntname=owner.employeentname, 
    active=1, 
    sr_datareduce_summary_code="Z07126"):

    # do something with obj
    print(obj.sr_datareduce_summary_code)
0 голосов
/ 18 мая 2018
queryset = QVReportAccess.objects.filter(ntname=owner.employeentname, active=1).values_list('sr_datareduce_summary_code', flat=True)

if queryset.exists() and str(queryset[0]) == "Z07126":
    appaccess = 'yes'
else:
    appaccess = 'no'

print(appaccess)

поэтому filter() в основном возвращает queryset, а не объект, он также может быть пустым, лучший способ проверить, является ли набор запросов пустым или нет, использовать exists() values_list() возвращает кортежи при повторениинад.Каждый кортеж содержит значение из соответствующего поля, переданного в него.

Если вы передаете только одно поле, вы также можете передать параметр flat.Если True, то это будет означать, что возвращаемые результаты представляют собой одиночные значения, а не однократные.Пример, когда вы не передаете flat=True:

>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]

, когда вы передаете flat=True:

>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]

Я надеюсь, вы получите идею для решения вашей проблемы.

0 голосов
/ 18 мая 2018

Вы сравниваете список со строкой, которая никогда не будет истинной

Либо вам просто нужно проверить, существует ли этот код в в фильтре

if QVReportAccess.objects.filter(ntname = owner.employeentname, active = 1, sr_datareduce_summary_code= "Z07126").exists():

или, если вам нужно сохранить values_list, присвойте его переменной и используйте in с values_list('sr_datareduce_summary_code', flat=True)

if 'Z07126' in my_query_list:
...