оригинальной проблема вызвано довольно неудобные моделями велосипедных ссылка:Wrong GROUP BY полей в Django аннотировать запрос
# A -> B -> A
class A:
b = models.ForeignKey('B', null=True, blank=True)
class B:
a = models.ForeignKey('A')
Теперь, когда я пытаюсь аннотировать запрос, он всегда использует GROUP BY в идентификационном от LEFT OUTER JOIN (T3.id в примере ниже) вместо a.id.
Пример:
A.objects.select_related('b', 'b__a').annotate(reviews=Count('reviews'))
Сгенерированный SQL:
SELECT
`a`.`id`,
`b`.`id`,
T3.`id`,
FROM
`a`
LEFT OUTER JOIN
`b` ON (`a`.`b_id` = `b`.`id`)
LEFT OUTER JOIN
`a` T3 ON (`b`.`a_id` = T3.`id`)
WHERE
`a`.`id` IN (1, 2, 3, 4, 5)
GROUP BY T3.`id`
ORDER BY NULL;
Я знаю, что я могу сделать следующие вещи:
- Изменить модель не делать ссылки на велосипеде (к сожалению, не может сделать что прямо сейчас)
- Может использовать .extra() вместо аннотаций (Я бы попытаться избежать его)
- Удалить .select_related вызова() (не могу сделать из-за проблемы с производительностью)
UPD: Использование GROUP BY T3.id исключат результаты, где абы = = None
Лучшим решением для меня было бы просто указать правильное поле в предложении GROUP BY, но я не знаю, как это сделать. Является ли это возможным? Есть ли другой способ решить проблему? Благодарю.
Не 'T3 == a', от' А, как T3'? Не уверен, чего вы пытаетесь достичь здесь. – mccc
Использование GROUP BY T3.id исключает результаты, где a.b == None, пока этого не ожидалось. – ZAN
Что касается того, чего я пытался достичь - модель может иметь родительский объект через B. Я знаю, что это не лучший подход, но это была своего рода эволюция модели. – ZAN