Многозначные отношения

Объем многозначных отношений

При охвате поля ManyToManyField или обратного ForeignKey (например, от Blog к Entry), при фильтрации по нескольким атрибутам возникает вопрос, нужно ли требовать, чтобы каждый атрибут совпадал в одном и том же связанном объекте. Мы можем искать блоги, в которых есть запись от 2008 года с "Ленноном" в заголовке, или мы можем искать блоги, в которых просто есть любая запись от 2008 года, а также более новая или старая запись с "Ленноном" в заголовке

Чтобы выбрать все блоги, содержащие хотя бы одну запись за 2008 год с "Ленноном" в заголовке (одна и та же запись, удовлетворяющая обоим условиям), мы напишем:

Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)

Иначе, чтобы выполнить более разрешительный запрос, выбирающий все блоги, в которых есть только записи с "Ленноном" в заголовке и записи от 2008 года, мы напишем:

Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)

Предположим, что существует только один блог, в котором есть и записи, содержащие "Леннон", и записи за 2008 год, но ни одна из записей за 2008 год не содержит "Леннона". Первый запрос не выдаст ни одного блога, но второй запрос выдаст этот единственный блог. (Это происходит потому, что записи, отобранные вторым фильтром, могут совпадать или не совпадать с записями в первом фильтре. Мы фильтруем элементы блога с помощью каждого оператора фильтра, а не элементы записи). Короче говоря, если каждое условие должно соответствовать одному и тому же связанному объекту, то каждое из них должно содержаться в одном вызове filter().

МОЙ ВОПРОС: чем отличаются оба вышеуказанных запроса, они кажутся мне почти одинаковыми, но дают разные результаты, пожалуйста, разъясните мне это.

Вернуться на верх