合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 较少用到的Queryset方法的一些坑 extra方法: queryset中有时会出现多个字段为条件进行的查询,这种查询是正常的查询函数无法表达的,django中使用了extra方法来实现这种需求,但是这里也有一个需要注意的点,比如最近做的合并医生 ~~~py ptp = ProfessionalToProducts.advance_objecs.filter(professional=from_account).\ values_list('professional_id', 'product_id') result = ProductMetrics.advance_objects.filter(professional=to_account).\ extra(where=['(professional_id, product_id) in %s'], params=set(ptp)) ~~~ 最初的queryset是这么写的,但是最后显示SQL语法报错,这里简单讲一下原因,首先params应该是一个数组参数,对这里的情况来说,ptp这个values_list只是其中一个where条件的标准而已,所以即使它是一个数组也应该被包进另外一个数组中作为一个元素出现,其次这里还有一个问题即where中已经以raw SQL的形式写成字符串SQL语句了,**所以后面的参数列表都必须保证每组条件为字符串,这才是这里报语法错误的真正原因**,所以真正的正确写法应该是 ~~~py ptp = ProfessionalToProducts.advance_objecs.filter(professional=from_account).\ values_list('professional_id', 'product_id') ptp = map(lambda x: (str(x[0]), str(x[1]),), ptp) result = ProductMetrics.advance_objects.filter(professional=to_account).\ extra(where=['(professional_id, product_id) in %s'], params=[ptp]) ~~~ 上面这样才能保证所有条件参数都是都是字符串