我需要編寫一個複雜的查詢,它從一堆表中檢索大量數據。基本上,我需要找到模型帶連接的Django查詢
- 客戶
- 付款
- 發票
其中的關係以特定的方式相交的所有實例。在SQLAlchemy中,我將能夠像做
for c, p, i in session.query(Customer, Payment, Invoice).\
filter(User.id==Payment.customer_id).\
filter(Invoice.id==Payment.invoice_id).\
filter(Payment.date==...).\
filter(Customer.some_property==...)
all():
# Do stuff ...
這將使我設置一些限制,並在一次檢索這一切。在Django的,我現在不喜歡
customers = Customer.objects.filter(...)
payments = Payment.objects.filter(customer=customer)
invoices = Invoice.objects.filter(customer=customer, payment_set=payments)
一些愚蠢的現在,我們已經有了三個不同的查詢(一些細節被忽略了保持簡單)。我可以減少到一個嗎?好吧,我可以做類似
customers = Customer.objects.filter(...).prefetch_related(
'payments', 'payments__invoices'
)
,但現在我要遍歷而不必行這一切奠定了整齊,像SQLAlchemy的數據的一個瘋狂的樹。 Django有什麼辦法可以做到這一點?或者我是否必須直接進入自定義SQL?
一些數據庫專家說,如果您的查詢跨越兩個以上的表,那麼您應該使用SQL而不是使用ORM。就我個人而言,我從來沒有基準測試過這兩個選項,但你可以嘗試這樣做。 – elynch