django:通过从日期中提取月份和年份进行分组

django: group by extracting month and year from a date

我正在尝试获取尚未向某人付款的发票位置列表。

在互联网上寻找这个“解决方案”

src_invoice_month_year = InvoicePosition.objects.values_list("designer_id", ExtractYear('created_at'),ExtractMonth('created_at'))\
.filter(payoutposition__isnull=True, designer_id=designer.id).distinct()

但是查询结果是:

SELECT DISTINCT `accounting_invoiceposition`.`designer_id`, EXTRACT(YEAR FROM `accounting_invoiceposition`.`created_at`) AS `extractyear1`,
                EXTRACT(MONTH FROM `accounting_invoiceposition`.`created_at`) AS `extractmonth2`, `accounting_invoiceposition`.`created_at`, `accounting_invoiceposition`.`id`
FROM `accounting_invoiceposition` LEFT OUTER JOIN `partners_payoutposition` ON (`accounting_invoiceposition`.`id` = `partners_payoutposition`.`invoiceposition_id`)
WHERE (`accounting_invoiceposition`.`designer_id` = 3 AND `partners_payoutposition`.`id` IS NULL)
ORDER BY `accounting_invoiceposition`.`created_at` DESC, `accounting_invoiceposition`.`id` DESC

所以他添加了“created_at”和来自 invoiceposition 模型的 ID,尽管我不想要那样!

例如,我在数据库中有以下 4 行:

date                id
2011-12-13 13:57:43 60300
2011-12-13 13:57:43 60288
2011-11-07 13:14:29 55135
2011-11-07 13:14:29 55134

那我就想要

2011 12
2011 11

(我是 运行 designer_id 3 的查询)

很难用如此少的信息猜测你想要什么。但根据您提供的输入和输出,以下内容应该可以解决问题。

src_invoice_month_year = (
    InvoicePosition.objects.filter(payoutposition__isnull=True, designer_id=designer.id)
    .values_list(ExtractYear("created_at"), ExtractMonth("created_at"))
    .distinct()
)

首先过滤对象,然后 select 不同的月份和年份。