【发布时间】:2014-11-11 11:05:03
【问题描述】:
我正在用 django 编写一个会计应用程序,有 Orders,其中有一个创建发票的日期和一个可选的创建贷方票据的日期。
class Order(models.Model):
date_invoice_created = models.DateTimeField(null=True, blank=True)
date_credit_note_created = models.DateTimeField(null=True, blank=True)
我目前正在为我们的会计师开发视图,她希望在管理面板的不同行中同时显示发票和贷项通知单,并按各自的创建日期排序。
所以基本上我想在不同的行中显示相同的模型两次,按不同的字段排序。在 SQL 中,这将类似于:
SELECT id, create_date FROM (
SELECT id, date_invoice_created AS create_date, 'invoice' AS type FROM order
UNION
SELECT id, date_credit_note_created AS create_date, 'creditnote' AS type FROM order
) ORDER BY create_date
不要介意我的 SQL-fu 不是最新的,但我想你明白我的意思。
所以我试图让 django 为我做这件事,通过覆盖第二个查询集中的日期,因为 django 不支持两个 extra'd 查询集的联合:
invoices = Order.objects.filter(date_invoice_created__isnull=False)
credit_notes = Order.filter_valid_orders(qs
).filter(
date_credit_note_created__isnull=False
).extra(
select={'date_invoice_created': 'date_credit_note_created'}
)
return (invoices | credit_notes).order_by('date_invoice_created')
不幸的是,union 的按位或运算始终确保 ID 是不同的,但我真的不希望它们不同。如何实现具有重复行的联合?
【问题讨论】:
-
在我看来您正在进行一些过早的优化。如果这是两个不同的列表,彼此独立显示,那么您为什么要如此努力地在单个查询中获取它们?
-
因为我想保留
contrib.admin接口提供的所有功能,它使用查询集来发挥它的魔力。 -
这可能是你想要的:stackoverflow.com/questions/431628/…
-
谢谢,但
itertools.chain与查询集接口不兼容,因此不适用于我的情况。我需要一个查询集,因为我想覆盖django.contrib.admin.ModelAdmin的queryset方法 ...
标签: python django union django-queryset