最近的案子,會應用到Django沒有 foreign key時,做join的部份
找了很久,終於找到解決方法了
趕快來寫個筆記
假設models.py是
class Order(models.Model):
order_no=models.CharField(max_length=50)
ship_adr=models.CharField(max_length=50)
product=models.CharField(max_length=50)
class Shipment(models.Model):
dshipment_id=models.AutoField(primary_key=True)
s_order_no=models.CharField(max_length=50)
而實際上s_order_no對應到order_no
那要怎麼寫 left join呢?
首先要
from django.db.models import OuterRef, Subquery
假設我們要輸出的主要是Shipment
那我們會寫Shipment
a = Shipment.objects.annotate(
希望多輸出的欄位名稱=Subquery( Order.objects.filter(order_no=OuterRef('s_order_no')).values('希望多輸出的欄位名稱')[:1]),
第二個希望多輸出的欄位名稱=Subquery( Order.objects.filter(order_no=OuterRef('s_order_no')).values('第二個希望多輸出的欄位名稱')[:1]),
)
以這個例子,就會是
a = Shipment.objects.annotate(
ship_adr=Subquery( Order.objects.filter(order_no=OuterRef('s_order_no')).values('ship_adr')[:1]),
product=Subquery( Order.objects.filter(order_no=OuterRef('s_order_no')).values('product')[:1]),
)
這樣就可以處理了,一開始會看不懂,但是多看幾次就懂了。