我一直在用 Django 1.7 改进我的 webapp。这很有趣……还有眼泪和鲜血!
事情是过去几天我一直在努力做一个简单的 LEFT JOIN 来汇总没有 FK 的表中的一些值。查询结果应该转到类视图 (DetailView)。相信我,我已经在整个网络(包括万维网)中搜索并搜索了答案,但无济于事。
你可能会问为什么我的表没有外键?好吧,最初的数据库设计没有,现在这些表包含数亿行。我可以添加 FK 约束,但这会很昂贵,但它会阻止事情,并且需要重新制作执行提取和加载的整个脚本!
我想回到旧的原始 SQL,因为根据 Django,
raw() 有许多其他选项使其非常强大......
是的,对。事实是model.objects.raw()它的功能是有限的,它不适用于我想做的事情(它只是不聚合)。
表/模型(简化)
Table `customer` (customer_id, order_id)
Table `order` (order_id, order_name)
MySQL/Django 查询(简化)
'SELECT a.order_id, SUM(a.order_value)
FROM order a
LEFT JOIN customer b
ON a.order_id = b.order_id
WHERE b.customer_id = %s', [customer_id]
看起来很无辜吧?一定不行!这是 Django 的噩梦!当然,我可以在 Django 中使用__set轻松做到这一点,但可惜我没有 FK。
除了我的问题之外,我还试图将聚合添加到我的 DetailView 模板中的上下文中。所以我尝试用View()破解它,并在我的 DetailView 自定义类中创建了一个函数:
def NewContextFTW():
# here get the freaking queryset in my own terms
return myhighlycomplexqueryset
然后在模板中:
{% for rows in view.NewContextFTW %}
{{rows.id}}
{{rows.sum_order_value}}
{% endfor %}
......但它失败了。
编辑: 我今天找到了解决方案!我想把爱分享给世界!请看下面我的回答。