簡體   English   中英

Django中,除了外鍵外,如何進行條件匹配的join查詢?

[英]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_textvalue_datevalue_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
;

我們遵循了@NickODellFilteredRelation的提示,我們的暫定解決方案類似於以下代碼片段:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM