2017-09-13 37 views
1

的Django 1.11.5嘗試在運行時使用過濾器來創建查詢集不返回行,但SQL看起來很好

我想在運行時

def query_cache(self, object: ObjectType, filters: List[MutableMapping] = None) -> QuerySet: 
    filters = filters or [] 
    object_name = object.value 
    q = Cin7Cache.objects.filter(object_type=f"'{object_name}'") 
    for f in filters: 
     q = q.filter(**f) 
    return q 

我建立一個查詢與篩選器鏈設置得到一個始終計算爲無行的查詢集。 生成的sql很好。如果我在PostgreSQL上運行它,我得到了行我想

SELECT 
    "voga_cin7cache"."object_uniqueID", 
    "voga_cin7cache"."object_type", 
    "voga_cin7cache"."last_modified", 
    "voga_cin7cache"."jdata" 
FROM "voga_cin7cache" 
WHERE ("voga_cin7cache"."object_type" = 'orders' AND ("voga_cin7cache"."jdata" -> 'createdDate') > '"2017-09-09"'); 

我可以產生相同的SQL本:

result_query = Cin7Cache.objects.filter(object_type='orders').filter(jdata__createdDate__gt='2017-09-09') 

在這種情況下,result_query不是空的。 在這種情況下,查詢是:

SELECT 
    "voga_cin7cache"."object_uniqueID", 
    "voga_cin7cache"."object_type", 
    "voga_cin7cache"."last_modified", 
    "voga_cin7cache"."jdata" 
FROM "voga_cin7cache" 
WHERE ("voga_cin7cache"."object_type" = orders AND ("voga_cin7cache"."jdata" -> 'createdDate') > '"2017-09-09"') 

它不完全一樣:在PostgreSQL的評價時,在where子句中,字符串常量「訂單」沒有報價,第二次,但都給出相同的結果集安慰。 當我檢查查詢集對象,在非工作案例中,我有_result_cache = [] ,在第二個示例中,工作的查詢集有_result_cache=None
爲什麼我的第一個查詢集是空的?

回答

1

查詢字符串並不總是相同的跑步,試試吧,沒有單引號:

q = Cin7Cache.objects.filter(object_type=f"{object_name}") 
#           ^^^   ^^^ 
+0

是不太奇怪。這兩個查詢在postgresql控制檯中執行時都可以工作,但是您的建議在Django中解決了這個問題。我會知道將來會更細心地對待這些細節。謝謝。 –

相關問題