2022年2月25日 星期五

Django沒有 foreign key時,做join

最近的案子,會應用到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]),

)

這樣就可以處理了,一開始會看不懂,但是多看幾次就懂了。