2016-04-08 204 views
0

在其中一個django應用程序中,我們使用兩個數據庫引擎A和B,它們都是相同的數據庫,但具有不同的模式。我們在兩個模式中都有一個名爲C的表,但是使用數據庫路由時,它總是指向數據庫B.我們已經從A中的一個模型形成了一個值列表查詢集,試圖在表C中使用過濾條件__in傳遞相同的值,但是它雖然有匹配的記錄,但總是提取空。當我們將valueslist queryset轉換爲列表並使用過濾器條件__in在表C中使用它時,它工作正常。django valueslist跨數據庫引擎的查詢集

不工作

data = modelindbA.objects.values_list('somecolumn',flat=True) 
info = C.objects.filter(somecolumn__in=data).values_list 

工作

data = modelindbA.objects.values_list('somecolumn',flat=True) 
data = list(data) 
info = C.objects.filter(somecolumn__in=data).values_list 

我已閱讀Django文檔和其他SO問題,找不到任何東西相對。我的猜測是,因爲這兩個模型是在不同的數據庫模式,上述不起作用。我需要關於如何解決此問題的幫助。

回答

0

當您使用帶有__in的查詢集時,Django將構造一個使用__in子句的子查詢的單個SQL查詢。由於這兩個表位於不同的數據庫中,因此不會匹配任何行。

相比之下,如果您將第一個查詢集轉換爲列表,Django將繼續並從第一個數據庫獲取數據。當您將該數據傳遞給第二個查詢時,打到第二個數據庫,它將按預期工作。

有關詳細信息,請參閱documentation for the in field lookup

你也可以使用一個QuerySet動態評估值的列表,而不是提供文字值列表的....這queryset的將被評估爲子查詢語句:

SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%') 
+0

謝謝凱文。我也嘗試過這種方式,但它沒有; t解決困惑我更多:( data = list('somecolumn',flat = True)) info = C.objects.filter(somecolumn__in =數據).values_list 我期待這個工作,因爲在使用列表數據庫命中將被迫,那裏的價值將已經進入數據對象,但即使這樣做不成功,你可以請一些洞察這個奇怪的行爲,非常感謝你的信息 – Giri

+0

@Giri:我很困惑,在你的問題中,你說的方法是「Working」。 –

+0

Kevin我的意思是將valueslist queryset轉換爲列表並在另一個數據庫作品中查詢模型我的疑問是:
data = list(modelindbA.objects.values_list('somecolumn',flat = True))。通過使用上面的「list」,會有一個立即數據庫命中,值將是f從模型中蝕刻出來,並將變成可變的「數據」。現在如果我通過
info = C.objects.filter(somecolumn__in = data)使用這個「數據」變量。values_list,因爲對象現在已經存在於「數據」變量中,所以我期待這樣做。 – Giri

0

由於values_list方法返回django.db.models.query.QuerySet,而不是利ST。 當你在同一個模式中使用它時,orm優化它,並且應該只做一個查詢,但是當模式不同時它會失敗。 只需使用list()。

我甚至會建議將它用於一個模式,因爲它可以降低查詢的複雜度並在大表上更好地工作。