zoukankan      html  css  js  c++  java
  • Django model层之执行原始SQL查询

    Django model层之执行原始SQL查询

    by:授客 QQ1033553122

     

    测试环境

    Win7

    Django 1.11

     

     

     

    执行原始SQL查询

    Manager.raw(raw_queryparams=Nonetranslations=None)

    例子:

    from website.models import API_case_tree

     

    sql_for_cases_query = 'SELECT id creater FROM website_api_case_tree'

    query_set = API_case_tree.objects.raw(sql_for_cases_query)

    for item in query_set:

        print(item.id, item.creater)

    说明:

    执行raw查询,查询列必须包含主键id

     

    某次实践时发现,通过raw执行以下语句,会报错:not enough arguments for format string

    SELECT data_date, group_id as id, groupname AS name

    FROM tb_zentao_group_defect_trend_daily_statistics WHERE DATE_FORMAT(data_date,"%Y-%m-%d") >="2019-05-01" AND DATE_FORMAT(data_date,"%Y-%m-%d") <="2019-08-03"

     

    解决方案:格式化参数中的 % 写成 %%,如下:

    SELECT data_date, group_id as id, groupname AS name

    FROM tb_zentao_group_defect_trend_daily_statistics WHERE DATE_FORMAT(data_date,"%%Y-%%m-%%d") >="2019-05-01" AND DATE_FORMAT(data_date,"%%Y-%%m-%%d") <="2019-08-03"

     

     

     

    序列化

    假如想要序列化上述例子中返回的RawQuerySet,可才用以下方式

    from django.core import serializers

     

    result = json.loads(serializers.serialize('json',  query_set), encoding='utf-8')

    如果返回的RawQuerySet为空,则序列化结果result为 [],否则返回类似以下结果

    [{'pk': 400, 'model': 'appName. website_api_case_tree, 'fields': {'id': 24, 'creater': '曾龙'}}, {'pk': 401, 'model': 'appName. website_api_case_tree, 'fields': {'id': 24, 'creater': 'x彬'}}]

     

    说明:pk为主键,对应数据库的主键id,model为数据表对应的的应用的model,appName为创建的应用的名称,fields存放查询的字段结果

     

    另外,也可以通过fields参数限制 fields字段值中返回的字段(需要注意的时,fields中指定的字段必须时数据库中存在的字段,不能是别名)

    例子:限制fields中仅返回id和creater字段

    serializers.serialize('json',  query_set, fields=('id', 'creater'))

     

    注意:实践时发现,执行的sql语句关联表时使用了左连接,发现采用上述方式对结果集进行序列化后,右表中的字段全部缺失,解决方法如下,通过遍历获取对应结果:

    query_set = Project.objects.raw(sql)
    rows = []

    for item in query_rows:

    item.__dict__.pop('_state') # 移除不必要的字段

    # 针对datetime、date类型字段,需要格式化处理,有必要也可以封装成函数

        item.__dict__['create_time'] =   item.__dict__['create_time'].strftime('%Y-%m-%d %H:%M:%S')

        item.__dict__['update_time'] = item.__dict__['update_time'].strftime('%Y-%m-%d %H:%M:%S')

        item.__dict__['begin_time'] = item.__dict__['begin_time'].strftime('%Y-%m-%d')

        item.__dict__['end_time'] = item.__dict__['end_time'].strftime('%Y-%m-%d')

        rows.append(item.__dict__)

     

     

     

  • 相关阅读:
    ie6不支持label
    IE6下li会继承ul属性的bug、产生条件、解决办法
    玉树地震与汶川地震
    IE6给png图片添加透明级别
    使用Float布局容器高度出错的决办法
    CSS冒泡窗口,有机会改成js的
    沁园春《房》
    乱接电话的笑话~
    禁止使用英文及其缩写?
    jQuery
  • 原文地址:https://www.cnblogs.com/shouke/p/13462958.html
Copyright © 2011-2022 走看看