[英]In Django, how to make a join query with matching conditions in addition to the foreign key?
我們有一個手寫的SQL查詢用於概念驗證,希望用Django框架實現功能。
具體來說,Django的QuerySet通常通過外鍵與被引用表的主鍵匹配來實現連接查詢。 但是,在下面的示例 SQL 中,除了外鍵之外,我們還需要額外的匹配條件,例如下面示例代碼段中的eav_phone.attribute_id = 122
。
...
left outer join eav_value as eav_postalcode
on t.id = eav_postalcode.entity_id and eav_phone.attribute_id = 122
...
問題:
我們想知道是否有一種方法可以使用 Python、Django 框架或庫來做到這一點。
我們還想知道其他編程語言是否有任何成熟的工具包,我們可以將其稱為設計模式。 因此,我們非常感謝任何提示和建議。
背景和技術細節:
該場景是一個報告,其中包含Django-EAV自定義列的事務。 該庫實現了由不同數據類型的列組成的eav_value
表,例如value_text
、 value_date
、 value_float
等。
我們分叉了 Django-EAV 的內部存儲庫並將其升級到 Python 3,因此我們可以使用任何最新的 Python 功能,盡管我們沒有使用 Django-EAV2。 據我們所知,新版本 EAV2 遵循相同的數據庫模式設計。
因此,應用程序定義了一個具有特定數據類型屬性的產品,我們在這個問題中將其稱為元數據,例如:
屬性編號 | 鼻涕蟲 | 數據類型 |
---|---|---|
122 | 郵政編碼 | 文本 |
123 | 電話 | 文本 |
... | ... | 例如日期,浮動等...... |
一筆交易就是一個實體, eav_value
表包含多條記錄,匹配entity_id
對應不同的自定義屬性。 並且我們想根據元數據構建一個動態的 QuerySet 來組裝帶有left outer join
的自定義列,類似於下面的示例 SQL 查詢。
select
t.id, t.create_ts
, eav_postalcode.value_text as postalcode
, eav_phone.value_text as phone
from
(
select * from transactions
where product_id = __PRODUCT_ID__
) as t
left outer join eav_value as eav_postalcode
on t.id = eav_postalcode.entity_id and eav_phone.attribute_id = 122
left outer join eav_value as eav_phone
on t.id = eav_phone.entity_id and eav_phone.attribute_id = 123
;
我們遵循了@NickODell對FilteredRelation
的提示,我們的暫定解決方案類似於以下代碼片段:
transaction_eav = transaction.annotate(
eav_postalcode=FilteredRelation('eav_values', condition=Q(eav_values__attribute_id=22))
)
transaction_eav = transaction_eav.annotate(
value_postalcode=F('eav_postalcode__value_text)}
)
我們是 Django ORM 的新手,所以請指出上面的示例代碼是否包含任何低效或非標准缺陷。
非常感謝大家的寶貴建議!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.