Случай, в котором результаты «фильтра-запроса с несколькими аргументами» отличаются от «цепного фильтра-запроса», следующие:
Выбор ссылочных объектов на основе ссылок на объекты и отношения - один-ко-многим (или многие-ко-многим).
Несколько фильтров:
Referenced.filter(referencing1_a=x, referencing1_b=y)
# same referencing model ^^ ^^
Цепные фильтры:
Referenced.filter(referencing1_a=x).filter(referencing1_b=y)
Оба запроса могут выдавать разные результаты:
Если больше одного
строки в модели ссылок Referencing1
могут ссылаться на одну и ту же строку в
ссылки-модель Referenced
. Это может иметь место в Referenced
:
Referencing1
имеют 1: N (один ко многим) или N: M (много ко многим)
отношение корабль.
Пример:
Рассмотрим мое приложение my_company
имеет две модели Employee
и Dependent
. У сотрудника в my_company
может быть больше, чем иждивенцев (другими словами, иждивенцем может быть сын / дочь одного работника, в то время как у сотрудника может быть более одного сына / дочери).
Эхх, если предположить, что муж-жена оба не могут работать в my_company
. Я взял 1: м пример
Итак, Employee
является ссылочной моделью, на которую может ссылаться более чем Dependent
, которая является ссылочной моделью. Теперь рассмотрим состояние отношения следующим образом:
Employee: Dependent:
+------+ +------+--------+-------------+--------------+
| name | | name | E-name | school_mark | college_mark |
+------+ +------+--------+-------------+--------------+
| A | | a1 | A | 79 | 81 |
| B | | b1 | B | 80 | 60 |
+------+ | b2 | B | 68 | 86 |
+------+--------+-------------+--------------+
Зависимый a1
относится к работнику A
, а зависимый b1, b2
относится к работнику B
.
Теперь мой запрос:
Найти всех сотрудников, имеющих сына / дочь, имеющих отличительные знаки (скажем,> = 75%) как в колледже, так и в школе?
>>> Employee.objects.filter(dependent__school_mark__gte=75,
... dependent__college_mark__gte=75)
[<Employee: A>]
Вывод «A» зависимый «a1» имеет отличительные знаки как в колледже, так и в школе зависит от сотрудника «A». Примечание «B» не выбрано, потому что ни один из детей «B» не имеет отличительных знаков как в колледже, так и в школе. Реляционная алгебра:
Сотрудник ⋈ (школьная отметка> = 75 И отметка колледжа> = 75) Зависимая
Во втором случае мне нужен запрос:
Найти всех сотрудников, чьи некоторые из иждивенцев имеют отличительные знаки в колледже и школе?
>>> Employee.objects.filter(
... dependent__school_mark__gte=75
... ).filter(
... dependent__college_mark__gte=75)
[<Employee: A>, <Employee: B>]
На этот раз «B» также выбрано, потому что у «B» двое детей (более одного!), Один имеет отличительный знак в школе «b1», а другой имеет отличительный знак в колледже «b2».
Порядок фильтра не имеет значения, мы также можем написать запрос выше:
>>> Employee.objects.filter(
... dependent__college_mark__gte=75
... ).filter(
... dependent__school_mark__gte=75)
[<Employee: A>, <Employee: B>]
результат тот же! Реляционная алгебра может быть:
(Сотрудник ⋈ (школьный знак> = 75) Зависимый) ⋈ (колледж> = 75) Зависимый
Примечание следующее:
dq1 = Dependent.objects.filter(college_mark__gte=75, school_mark__gte=75)
dq2 = Dependent.objects.filter(college_mark__gte=75).filter(school_mark__gte=75)
Выводит тот же результат: [<Dependent: a1>]
Я проверяю целевой SQL-запрос, сгенерированный Django, используя print qd1.query
и print qd2.query
, оба одинаковы (Django 1.6).
Но семантически оба они отличаются от me . первый выглядит как простой раздел σ [school_mark> = 75 AND College_mark> = 75] (зависимый), а второй похож на медленный вложенный запрос: σ [school_mark> = 75] (σ [College_mark> = 75] (зависит)).
Если нужно Код @ кодовая панель
Кстати, это дано в документации @ Охват многозначных отношений Я только что добавил пример, думаю, это будет полезно для кого-то нового.