Существует ли различие между фильтром, и исключите в django? Если я имею
self.get_query_set().filter(modelField=x)
и я хочу добавить другого критерии, есть ли значимое различие между к следующим двум строкам кода?
self.get_query_set().filter(user__isnull=False, modelField=x)
self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
каждого считают лучшей практикой, или действительно ли они - то же и в функции и в производительности?
Оба оцениваются лениво, поэтому я ожидаю, что они будут работать одинаково. SQL, вероятно, другой, но без реального различия.
Это зависит от того, чего вы хотите достичь. С логическими значениями легко переключаться между .exclude ()
и .filter ()
, но как насчет, например, хотите ли вы получать все статьи, кроме мартовских? Вы можете написать запрос как
Posts.objects.exclude(date__month=3)
С .filter ()
это будет (но я не уверен, работает ли это на самом деле):
Posts.objects.filter(date__month__in=[1,2,4,5,6,7,8,9,10,11,12])
или вам придется использовать Q
объект.
Как уже следует из названия функции, .exclude ()
используется для исключения наборов данных из набора результатов. Для логических значений вы можете легко инвертировать это и использовать вместо него .filter ()
, но для других значений это может быть сложнее.
В общем случае исключение противоположно фильтру. В данном случае оба примера работают одинаково.
Здесь:
self.get_query_set().filter(user__isnull=False, modelField=x)
Вы выбираете записи, у которых поле user не null и modelField имеет значение x
В этом случае:
self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
Сначала вы выбираете записи, у которых modelField имеет значение x (и user в null и user не null), затем вы исключаете записи, у которых поле user null.
Я думаю, что в этом случае лучше использовать первый вариант, он выглядит более чистым. Но оба варианта работают одинаково.