Фильтр Django по сравнению с исключает

Существует ли различие между фильтром, и исключите в 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)

каждого считают лучшей практикой, или действительно ли они - то же и в функции и в производительности?

27
задан Kevin Brown 24 December 2014 в 01:29
поделиться

3 ответа

Оба оцениваются лениво, поэтому я ожидаю, что они будут работать одинаково. SQL, вероятно, другой, но без реального различия.

23
ответ дан 28 November 2019 в 04:52
поделиться

Это зависит от того, чего вы хотите достичь. С логическими значениями легко переключаться между .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 () , но для других значений это может быть сложнее.

15
ответ дан 28 November 2019 в 04:52
поделиться

В общем случае исключение противоположно фильтру. В данном случае оба примера работают одинаково.

Здесь:

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.

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

20
ответ дан 28 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: