Набор запросов Django ИСКЛЮЧИТЕЛЬНО: это эквивалентно? - PullRequest
0 голосов
/ 07 сентября 2018

В Джанго эти два эквивалента?

Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000)

и

Cars.objects.exclude(brand='mercedes', year__lte=2000)

Я знаю, что первый говорит: исключить любой Mercedes и исключить любой автомобиль старше 2000 года. Как насчет второго? Это говорит то же самое? Или это исключает только сочетание Мерседес старше 2000 года?

Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Два значения не эквивалентны.

Как указано в документации по exclude(..):

Параметры поиска (**kwargs) должны быть в формате, описанном в полевых поисках ниже. Несколько параметров объединяются через AND в базовом операторе SQL, и все это заключено в NOT().

Таким образом, первый запрос можно прочитать как:

-- first query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes') AND NOT (YEAR <= 2000)

, тогда как последний эквивалентен:

-- second query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes' AND YEAR <= 2000)

Первый запрос это семантически такой же, как " Все автомобили, которые не являются Mercedes; и которые не были построены ранееили в 2000".Тогда как второй запрос « Все автомобили, кроме Mercedeses, которые были построены до или в 2000 году. ».

Так что, если в таблице содержится Ford, который был построен в 1993 году, топервый запрос будет не включать его, тогда как второй будет, поскольку brand это не Mercedes, он не исключен (поэтому он будет частьюнабор запросов).

...