Bootstrap

django使用raw()执行sql语句多表查询

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 = 
;