1.环境
python3.7
django2.2.16
mysql5.7
2.raw()的用法
-
raw() 执行原始sql,并返回模型实例对象。
-
可用于多表关联查询
-
返回结果必须包含实例对象对应数据库表的主键
-
虽然返回结果是实例对象,但是对于多表关联查询,返回结果可以包含非实例对象(关联查询表)的字段属性。
-
如果最终查询结果中有的字段不存在于任何实例对象或关联查询对象中则会报错[Cannot resolve keyword ‘XXX’ into field. Choices are: app_label, id, model…],即最终查询的字段必须在关联查询的表中,不能凭空捏造。
3.实例
数据库表:product(产品表) model_replace(产品型号替换表),两个表并没有外键关联关系,只是通过一个product_unique_sign去关联
product
product_id | product_name | product_model | product_unique_sign |
---|---|---|---|
1 | 产品1 | model01 | 1001 |
2 | 产品2 | model02 | 1002 |
3 | 产品3 | model03 | 1003 |
model_replace
model_id | product_model | product_model_replace | product_unique_sign |
---|---|---|---|
1 | model02 | model01 | 1002 |
2 | model02 | model03 | 1002 |
def search(request):
params = ""
# 根据自己的业务逻辑可以在params添加where的查询条件,拼接到sql_str字符串中
# 如果是字符串类型的参数,记得在{}的两侧加上单引号,否则会报错。
# 因为生成的sql语句 会是 and p.product_model = model02 。这种SQL语句肯定是错误的。
param_model =