У меня возникла проблема при создании запроса с использованием объектов Q
. Я получаю разные результаты в зависимости от того, как я заказываю некоторые условия 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
. Это заставляет меня чувствовать, что все мои запросы могут возвращать плохие результаты в зависимости от того, как я устрою его условия. Является ли это ошибкой или я что-то делаю (или все) неправильно?
Упрощение ваших моделей - [Good Thing ™] (http://sscce.org/) –