Я строит динамические фильтры, которые я прохожу мимо GET к QuerySet фильтра:Джанго QuerySet фильтр на пустой список
for k, v in request.GET.iteritems():
kwargs[str(k)] = str(v)
students = models.Student.objects.filter(**kwargs)
и он работает почти всех запросов я метательные на него. Тем не менее, у меня есть родственная модель с большим количеством отношений, Group. Таким образом, студент может быть членом многих групп. Я могу отфильтровать учащихся, принадлежащих к данной группе, следующим образом: 'groups__in='+str(group.id)
, например. - //example.com/students/?groups__in=1
Но я не могу понять, как фильтровать для студентов, которые не принадлежат ни к какой группе. Я пробовал следующее без успеха:
groups__in=None # students == []
groups__exact=None # students == []
groups__iexact=None # FAIL not that I really expected this to work
groups__isnull=True # students == []
Последняя версия была тем, что я надеялся на самом деле работать. Я уверен, что я мог бы получить эту работу, изменяя верхний код на что-то вроде
if request.GET['something']:
students = models.Student.objects.exclude(groups__isnull=False)
else:
students = models.Student.objects.filter(**kwargs)
Так что я думаю, вопрос становится, как я могу создать
students = models.Student.objects.exclude(groups__isnull=False)
с помощью .filter()?
Я принял первый ответ, так как это правильно, но это не исправить мою ошибку. В ** kwargs есть проблема с расширением, и я открыл новый вопрос об этом [здесь] (http://stackoverflow.com/questions/5762328/django-dynamic-filter-failure). Спасибо – selfsimilar
Спасибо @ jammon и @DTing. Реальная проблема с этим заключалась в попытке передать логическое значение в GET. Он передавался через ** kwargs как строка «True», а не «True». Что работает, когда передается 'models.Student.objects.exclude (** kwargs)', так как 'True' оценивает 'True'. Но сопряжение не будет работать, так как «False» по-прежнему оценивает значение «True» при передаче в «models.Students.objects.filter (** kwargs)». Отсюда моя путаница. – selfsimilar