zoukankan      html  css  js  c++  java
  • Python--day71--ORM分组补充

    1,ORM映射对应的sql语句:

    2,QuerySet

    QuerySet方法大全

      1 ##################################################################
      2 # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
      3 ##################################################################
      4 
      5 def all(self)
      6     # 获取所有的数据对象
      7 
      8 def filter(self, *args, **kwargs)
      9     # 条件查询
     10     # 条件可以是:参数,字典,Q
     11 
     12 def exclude(self, *args, **kwargs)
     13     # 条件查询
     14     # 条件可以是:参数,字典,Q
     15 
     16 def select_related(self, *fields)
     17     性能相关:表之间进行join连表操作,一次性获取关联的数据。
     18 
     19     总结:
     20     1. select_related主要针一对一和多对一关系进行优化。
     21     2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
     22 
     23 def prefetch_related(self, *lookups)
     24     性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
     25 
     26     总结:
     27     1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
     28     2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。
     29 
     30 def annotate(self, *args, **kwargs)
     31     # 用于实现聚合group by查询
     32 
     33     from django.db.models import Count, Avg, Max, Min, Sum
     34 
     35     v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
     36     # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
     37 
     38     v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
     39     # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
     40 
     41     v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
     42     # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
     43 
     44 def distinct(self, *field_names)
     45     # 用于distinct去重
     46     models.UserInfo.objects.values('nid').distinct()
     47     # select distinct nid from userinfo
     48 
     49     注:只有在PostgreSQL中才能使用distinct进行去重
     50 
     51 def order_by(self, *field_names)
     52     # 用于排序
     53     models.UserInfo.objects.all().order_by('-id','age')
     54 
     55 def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
     56     # 构造额外的查询条件或者映射,如:子查询
     57 
     58     Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
     59     Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
     60     Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
     61     Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
     62 
     63  def reverse(self):
     64     # 倒序
     65     models.UserInfo.objects.all().order_by('-nid').reverse()
     66     # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
     67 
     68 
     69  def defer(self, *fields):
     70     models.UserInfo.objects.defer('username','id')
     71  72     models.UserInfo.objects.filter(...).defer('username','id')
     73     #映射中排除某列数据
     74 
     75  def only(self, *fields):
     76     #仅取某个表中的数据
     77      models.UserInfo.objects.only('username','id')
     78  79      models.UserInfo.objects.filter(...).only('username','id')
     80 
     81  def using(self, alias):
     82      指定使用的数据库,参数为别名(setting中的设置)
     83 
     84 
     85 ##################################################
     86 # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
     87 ##################################################
     88 
     89 def raw(self, raw_query, params=None, translations=None, using=None):
     90     # 执行原生SQL
     91     models.UserInfo.objects.raw('select * from userinfo')
     92 
     93     # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
     94     models.UserInfo.objects.raw('select id as nid from 其他表')
     95 
     96     # 为原生SQL设置参数
     97     models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
     98 
     99     # 将获取的到列名转换为指定列名
    100     name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
    101     Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
    102 
    103     # 指定数据库
    104     models.UserInfo.objects.raw('select * from userinfo', using="default")
    105 
    106     ################### 原生SQL ###################
    107     from django.db import connection, connections
    108     cursor = connection.cursor()  # cursor = connections['default'].cursor()
    109     cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    110     row = cursor.fetchone() # fetchall()/fetchmany(..)
    111 
    112 
    113 def values(self, *fields):
    114     # 获取每行数据为字典格式
    115 
    116 def values_list(self, *fields, **kwargs):
    117     # 获取每行数据为元祖
    118 
    119 def dates(self, field_name, kind, order='ASC'):
    120     # 根据时间进行某一部分进行去重查找并截取指定内容
    121     # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
    122     # order只能是:"ASC"  "DESC"
    123     # 并获取转换后的时间
    124         - year : 年-01-01
    125         - month: 年-月-01
    126         - day  : 年-月-127 
    128     models.DatePlus.objects.dates('ctime','day','DESC')
    129 
    130 def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
    131     # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
    132     # kind只能是 "year", "month", "day", "hour", "minute", "second"
    133     # order只能是:"ASC"  "DESC"
    134     # tzinfo时区对象
    135     models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
    136     models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
    137 
    138     """
    139     pip3 install pytz
    140     import pytz
    141     pytz.all_timezones
    142     pytz.timezone(‘Asia/Shanghai’)
    143     """
    144 
    145 def none(self):
    146     # 空QuerySet对象
    147 
    148 
    149 ####################################
    150 # METHODS THAT DO DATABASE QUERIES #
    151 ####################################
    152 
    153 def aggregate(self, *args, **kwargs):
    154    # 聚合函数,获取字典类型聚合结果
    155    from django.db.models import Count, Avg, Max, Min, Sum
    156    result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
    157    ===> {'k': 3, 'n': 4}
    158 
    159 def count(self):
    160    # 获取个数
    161 
    162 def get(self, *args, **kwargs):
    163    # 获取单个对象
    164 
    165 def create(self, **kwargs):
    166    # 创建对象
    167 
    168 def bulk_create(self, objs, batch_size=None):
    169     # 批量插入
    170     # batch_size表示一次插入的个数
    171     objs = [
    172         models.DDD(name='r11'),
    173         models.DDD(name='r22')
    174     ]
    175     models.DDD.objects.bulk_create(objs, 10)
    176 
    177 def get_or_create(self, defaults=None, **kwargs):
    178     # 如果存在,则获取,否则,创建
    179     # defaults 指定创建时,其他字段的值
    180     obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 2})
    181 
    182 def update_or_create(self, defaults=None, **kwargs):
    183     # 如果存在,则更新,否则,创建
    184     # defaults 指定创建时或更新时的其他字段
    185     obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 1})
    186 
    187 def first(self):
    188    # 获取第一个
    189 
    190 def last(self):
    191    # 获取最后一个
    192 
    193 def in_bulk(self, id_list=None):
    194    # 根据主键ID进行查找
    195    id_list = [11,21,31]
    196    models.DDD.objects.in_bulk(id_list)
    197 
    198 def delete(self):
    199    # 删除
    200 
    201 def update(self, **kwargs):
    202     # 更新
    203 
    204 def exists(self):
    205    # 是否有结果
    206 
    207 QuerySet方法大全

    3,QuerySet方法的代码练习:批量创建,一对一和多对一关系优化,查询所有的部门和员工名称等等

     1 import os,sys
     2 
     3 if __name__ == '__main__':
     4     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ormday71.settings")
     5     import django
     6     django.setup()
     7 
     8     from app01 import models
     9     # ret = models.Employee.objects.all().values("id","dept")
    10     # print(ret)
    11 
    12     from django.db.models import Avg
    13     #ORM分组关键字annotate
    14     # ret = models.Employee.objects.values("dept").annotate(avg=Avg("salary")).values("dept","avg")
    15     # print(ret)
    16 
    17     # ret = models.Employee2.objects.values("dept_id").annotate(avg=Avg("salary")).values("dept__name", "avg")
    18     # print(ret)
    19 
    20 
    21     #查所有的员工和部门名称
    22     # ret = models.Employee2.objects.values("name","dept__name")
    23     # print(ret)
    24     #
    25     # ret = models.Employee2.objects.select_related().values("name","dept__name")
    26     # print(ret)
    27 
    28     #select_related主要针一对一和多对一关系进行优化
    29     #查询所有的作者
    30     ret = models.Author.objects.select_related().values("name","books__title")
    31     print(ret)
    32     print("="*120)
    33     ret = models.Author.objects.prefetch_related().values("name", "books__title")
    34     print(ret)
    35 
    36     #批量创建
    37     #有100个书籍对象
    38     objs = [models.Book(title="沙河{}".format(i)) for i in range(100)]
    39 
    40     #在数据库中批量创建
    41     #10次一提交,减少了数据库连接的次数
    42     models.Book.objects.bulk_create(objs,10)
  • 相关阅读:
    内存表id,name解决方案,举例(workspaces表)
    建立mysql远程访问账号
    mysql主从设定笔记
    mysql安装
    SAMBA 让Unix与Windows轻松共享 (2)
    /rc.d/rc.mysqld举例
    HTML编码规范1.0
    创建mysql存储过程
    《Linux企业应用案例精解》样章
    欢迎参加51CTO的技术门诊《OSSIM,企业信息安全管理利器》讨论
  • 原文地址:https://www.cnblogs.com/xudj/p/10585510.html
Copyright © 2011-2022 走看看