Я хочу обновить Django с 1.7.11 до 1.11.18.Но я нашел проблему.Django делает разные sql-запросы для разных версий Django.Например.У меня есть запрос:
Account.objects
.values('id', 'name', invoice__payment__payment_gateway')
.annotate(
pay_paid=Sum('invoice__payment__amount'),
pay_refunded=Sum('invoice__payment__amount_refunded')
)
.order_by('-name', )
sql-запрос для Django 1.7.11:
SELECT `member_account`.`id`,
`member_account`.`name`,
`member_payment`.`payment_gateway`,
SUM(`member_payment`.`amount_refunded`) AS `pay_refunded`,
SUM(`member_payment`.`amount`) AS `pay_paid`
FROM `member_account`
LEFT OUTER JOIN `member_invoice` ON ( `member_account`.`id` = `member_invoice`.`account_id` )
LEFT OUTER JOIN `member_payment` ON ( `member_invoice`.`id` = `member_payment`.`invoice_id` )
GROUP BY `member_account`.`id`, `member_account`.`name`, `member_payment`.`payment_gateway`
ORDER BY `member_account`.`name` DESC
Обратите внимание на раздел GROUP BY
.Есть 3 поля: id , имя , payment_gateway .
Но у нас есть следующий sql-запрос для Django 1.8.19:
SELECT `member_account`.`id`,
`member_account`.`name`,
`member_payment`.`payment_gateway`,
SUM(`member_payment`.`amount_refunded`) AS `pay_refunded`,
SUM(`member_payment`.`amount`) AS `pay_paid`
FROM `member_account`
LEFT OUTER JOIN `member_invoice` ON ( `member_account`.`id` = `member_invoice`.`account_id` )
LEFT OUTER JOIN `member_payment` ON ( `member_invoice`.`id` = `member_payment`.`invoice_id` )
GROUP BY `member_account`.`id`
ORDER BY `member_account`.`name` DESC
И у нас есть только одно поле в разделе GROUP BY
.Почему у нас есть только одно поле id ?Это главный вопрос.
НО, когда я удаляю поле id из секции values
Django 1.8 делает правильный sql-запрос:
SELECT `member_account`.`name`,
`member_payment`.`payment_gateway`,
SUM(`member_payment`.`amount_refunded`) AS `pay_refunded`,
SUM(`member_payment`.`amount`) AS `pay_paid`
FROM `member_account`
LEFT OUTER JOIN `member_invoice` ON ( `member_account`.`id` = `member_invoice`.`account_id` )
LEFT OUTER JOIN `member_payment` ON ( `member_invoice`.`id` = `member_payment`.`invoice_id` )
GROUP BY `member_account`.`name`, `member_payment`.`payment_gateway`
ORDER BY `member_account`.`name` DESC