Ниже я показываю свой пример с двумя группами, когда в коде более 20 групп. Я не уверен, есть ли лучший способ сделать это, если есть предложение.

Ниже я проверяю, есть ли у ученика «Все группы» для их студенческой группы, если я хочу, чтобы группы были «Нет». Эта часть работает нормально, как и все остальное.

    allgroups = 'All Groups'
# if user has all groups then no group will show
    if allgroups in studentgroup:
        bhstudentgrouplist = None
        abstudentgrouplist = None
    else:
        bhstudentgrouplist = Groups.objects.filter(~Q(group_id__in= 
        groupIds)).filter(group_id = 2000)
        abstudentgrouplist = Groups.objects.filter(~Q(group_id__in= 
        groupIds)).filter(group_id = 5000)

Что происходит, если у пользователя есть все возможные элементы в группе, они должны быть помечены как None, чтобы они не отображались в моем шаблоне. Для этого я попробовал следующее:

1 .

if not bhstudentgrouplist.exists():
    bhstudentgrouplist = None
if not abstudentgrouplist.exists():
    abstudentgrouplist = None

2 .

if bhstudentgrouplist.count() < 1:
    bhstudentgrouplist = None
if not abstudentgrouplist.count() < 1:
    abstudentgrouplist = None

3 .

if bhstudentgrouplist.isnull():
    bhstudentgrouplist = None
if not abstudentgrouplist.isnull():
    abstudentgrouplist = None

Это работает для случаев, за исключением случаев, когда у студента есть Все группы, я получаю сообщение об ошибке, не могу использовать функцию isnull (), count (), exist () для типа None. Как можно выполнить исправление, когда группа попадает во все группы, и у студента уже есть все отчеты в студенческой группе, поэтому для него должно быть установлено значение Нет? Если есть лучший способ пройти весь этот процесс, пожалуйста, направьте меня в этом направлении.

Процесс проверяет, есть ли у ученика все группы, если они этого не делают, он предоставит список доступных отчетов. Иногда у пользователя уже есть все доступные отчеты, в этих случаях для группы отчетов должно быть установлено значение none, поэтому она не возвращает доступные отчеты.

1
user1470034 13 Мар 2018 в 20:33

2 ответа

Лучший ответ

Вместо того, чтобы устанавливать bhstudentgrouplist в None, вы должны установить для него пустой набор запросов. Тогда он все еще будет иметь доступ к функциям набора запросов

 if allgroups in studentgroup:
    bhstudentgrouplist = Groups.objects.none()
    abstudentgrouplist = Groups.objects.none()
else:
    b...

Затем функции-члены набора запросов, такие как bhstudentgrouplist.count() = 0 работать, хотя я не уверен насчет isnull ()

1
MagicLAMP 13 Мар 2018 в 18:02

Я все еще немного не уверен в конечной цели, но я могу, по крайней мере, исправить ошибку, которую вы получаете. Если вы добавите проверку переменной перед каждым оператором if, вот так:

if bhstudentgrouplist and not bhstudentgrouplist.exists():

Таким образом, если одной из переменных является None, оператор потерпит неудачу, прежде чем попытаться вызвать функцию для него. В зависимости от вашего конкретного случая использования, вы можете в любом случае упростить его до простой проверки переменной:

if bhstudentgrounplist:

Или

if not bhstudentgrouplist:

Поскольку пустой список будет иметь значение false.

Еще одна вещь, которую следует учитывать, это хранить ваши данные в словаре. Ваши текущие имена переменных могут быть ключами, а списки могут быть значениями. Таким образом, вместо явной записи каждой проверки для 20 групп, вы можете просто пройти через нее.

0
M Dillon 13 Мар 2018 в 17:57