2017-09-13 44 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中解决了这个问题。我会知道将来会更细心地对待这些细节。谢谢。 –

相关问题