## 较少用到的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])
~~~
上面这样才能保证所有条件参数都是都是字符串
- Django基础
- 模型
- 外键
- Model Manager
- 过滤器函数
- 查询对象
- 字段的细节
- QuerySet的应用
- 视图
- Django类视图
- 权限控制
- Django进阶
- 中间件
- _meta组件
- 信号
- User模块
- prefetch_related和select_related的区别
- 较少被用到的查询对象
- Django的深层设计理念
- Declarative Syntax
- django的migration操作
- 较少用到的Queryset方法的一些坑
- Django配置
- Django环境配置变量
- Django源码阅读
- ORM
- QuerySet源码
- Query源码
- Q&F
- Model和Manager的详解
- Http请求响应
- HttpRequest
- 自建数据结构
- Django开发辅助工具
- Django-rest-framework
- Serializer
- 异步任务调度器Celery
- 数据库补充
- 定义
- 字段
- 事务
- 视图
- 函数
- 联结
- 窗口函数
- GROUPING运算符
- HAVING谓词
- django_bulk_update
- django_bulk_update源码分析
- 项目小功能开发
- Django的一些小细节