У меня возникла проблема при создании набора запросов с использованием объектов Q
. Я получаю разные результаты в зависимости от того, как я заказываю некоторые условия Q
. Я немного упрощу свои модели, чтобы четко описать мою проблему.
class D(models.Model):
one_attr = models.BooleanField()
s_attr = models.ManyToManyField(S, through='DRelatedToS')
d_to_p = models.ForeignKey(P)
class S(models.Model):
other_attr = models.BooleanField()
s_to_p = models.ForeignKey(P)
class DRelatedToS(models.Model):
to_s = models.ForeignKey(S)
to_d = models.ForeignKey(D)
date = models.DateField()
class P(models.Model):
the_last_attr = models.PositiveIntegerField()
Резюме отношений:
D <-- DRelatedToS --> S --> P | ^ | | -------->------->------>----^
С этими моделями и отношениями я получаю два разных результата в зависимости от того, как я упорядочиваю Q-условия: Первый запрос, который дает один результат
D.objects.filter(
Q(one_attr=True, s_attr__s_to_p__the_last_attr=5)
|
Q(one_attr=False, d_to_p__the_last_attr=10)
)
Второй запрос дает другой результат, отличный от первого запроса
D.objects.filter(
Q(one_attr=False, d_to_p__the_last_attr=10)
|
Q(one_attr=True, s_attr__s_to_p__the_last_attr=5)
)
Мой вопрос: почему это происходит? Есть ли какие-либо проблемы с тем, как я выполняю свой запрос?
Когда я смотрю операторы SQL, полученные из этих запросов, я получаю два разных оператора: один делает LEFT OUTER JOIN
и много INNER JOIN
, а второй дает все INNER JOIN
. Тот, который на самом деле возвращает то, что я хочу, это тот, который делает LEFT OUTER JOIN
. Это заставляет меня чувствовать, что все мои запросы могут возвращать плохие результаты в зависимости от того, как я устрою их условия. Это баг или я что-то (или все) делаю не так?