Django-ORM进阶操作02

来源:互联网 发布:百度新闻的评论 知乎 编辑:程序博客网 时间:2024/05/16 23:27
  • select_related() 查询主动做连表
    q = models.UserInfo.objects.all().filter(id__lt=60)    # for row in q:    #     print(row.id,row.name,row.ut.title)    # 这样进行查询性能不好,需要重新发sql请求在进行查询另外一张表中的数据,如果有10条数据就要进行11次查询    q = models.UserInfo.objects.all().values('name','id','ut__title').filter(id__lt=60)    # for i in q:    #     print(i['name'],i['ut__title'])    # 这样 进行了 优化 不回重复发送sql请求,到的结果内是字典    q = models.UserInfo.objects.all().select_related('ut').filter(id__lt=60)    print(q.query)    # for row in q:    #     print(row.id,row.name,row.ut.title)    # select_related('ut') 相当 于 inner join 先连成一张表再进行查询

  • prefetch_related() 不做连表,做多次查询
    q = models.UserInfo.objects.all().prefetch_related('ut').filter(id__lt=60)    for row in q:        print(row.id,row.name,row.ut.title)# 如果查询的数据比较多,查询的次数比较多就不建议用select_related进行连表查询,毕竟连表查询毕竟有损耗。

    # distinct()    v = models.UserInfo.objects.values('age').distinct()    for item in v:        print(item)    # 在mysql,sqlite中distinct()括号里是不能传参数,    # select distinct nid from userinfo;    # 而在 PostgreSQL 中    # models.UserInfo.objects.distinct('nid')

    # reverse()    v = models.UserInfo.objects.all().order_by('id').reverse()    # reverse() 必须在order_by()后使用不能单独使用。    for i in v:        print(i.id)    v = models.UserInfo.objects.all().order_by('-id','name').reverse()    # 相当于order_by('id','-name')

    # only()    v = models.UserInfo.objects.all()    # [obj]    v = models.UserInfo.objects.all().only('id','name')    # [obj]    for obj in v:        print(obj.name,obj.id,obj.age)        # 虽然加里only(),但是还能取出其他数据,但是不要这么取,会在再区表中进行查询影响效率,写几个取几个,不要多取    v = models.UserInfo.objects.values('id','name').all()    # [{id,name}]    for i in v:        print(i)

    # defer()    # defer() 和only()相反,取括号内以外的数据    # using()    # 指定数据库    # models.UserInfo.objects.all().using('db2')    # setting.py    '''    DATABASES = {        'default': {            'ENGINE': 'django.db.backends.sqlite3',            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),        },        'db2': {            'ENGINE': 'django.db.backends.mysql',            'NAME': 'db2',            'USER': 'root',            'PASSWORD': '',            'HOST': '',            'PORT': '',        }    }    '''

    # dates()        # # 根据时间进行某一部分进行去重查找并截取指定内容        # # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)        # # order只能是:"ASC"  "DESC"        # # 并获取转换后的时间        # - year: 年 - 01 - 01        # - month: 年 - 月 - 01        # - day: 年 - 月 - 日    # models.DatePlus.objects.dates('ctime', 'day', 'DESC')    # datetimes()        # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间        # kind只能是 "year", "month", "day", "hour", "minute", "second"        # order只能是:"ASC"  "DESC"        # tzinfo时区对象        # models.DDD.objects.datetimes('ctime', 'hour', tzinfo=pytz.UTC)        # models.DDD.objects.datetimes('ctime', 'hour', tzinfo=pytz.timezone('Asia/Shanghai'))    '''        pip3 install pytz        import pytz        pytz.all_timezones        pytz.timezone(‘Asia/Shanghai’)    '''

    # none()    # 取空    v = models.UserInfo.objects.none()    print(v)

    # aggregate()    from django.db.models import Count,Avg,Max    # 聚合整张表    result = models.UserInfo.objects.aggregate(k=Count('id'), n=Count('age'))    result = models.UserInfo.objects.aggregate(k=Count('id'),n=Count('age',distinct=True))    print(result)    # count()    # 计算个数

    # get()    v = models.UserInfo.objects.all().first()    v = models.UserInfo.objects.get(id=1) # 如果id=1 不存在 则会报错,找到多个也会报错

    # create()    obj = models.UserInfo.objects.create(name='summer',age=23,pwd = 'ab456')    # obj = models.UserInfo.objects.create(**{'name':'summer','age':123,'pwd':'ab456'})    print(obj.id) #  可以获取添加数据的自增ID    # 另外一种添加方法    obj = models.UserInfo(name='autumn',age=23,pwd='ab123')    obj.save()

    # bulk_create() 批量添加    objs = [        models.UserInfo(name='autumn',age=23,pwd='ab123'),        models.UserInfo(name='autumn1', age=23, pwd='ab123')    ]    models.UserInfo.objects.bulk_create(objs,10) # 10 代表一次提交10个对象 这个数最多别超过999

    # get_or_create()  如果纯在则获取,否者创建    obj, created = models.UserInfo.objects.get_or_create(name='summer1',                                                           defaults={'age':123,'pwd':'ab456'})    # 先根据条件去查,如果存在name='summer1',则后面的default无效不执行。    print(obj,created) # created 为True或False

    # update_or_create() 如果存在,则更新,否则,创建    obj, created = models.UserInfo.objects.update_or_create(name='summer1',                                                           defaults={'age':123,'pwd':'ab456'})    print(obj,created)

    # exists()    # 检查查询结果是否存在,返回True或False    result = models.UserInfo.objects.filter(id=1111).exists()    print(result)

    # in_bulk    # 根据主键进行查询。    res = models.UserInfo.objects.in_bulk([1,2,3])    # 相当于    res2 = models.UserInfo.objects.filter(id__in=[1,2,3])

    # 如果需要的sql语句Django这个没有提供,可以用下面3中方法解决    # extra    # 原生sql    # raw    # raw    res = models.UserInfo.objects.raw('select id,name,age from app01_userinfo  where id < 10')    for item in res:        print(item.age,item.name)    # 为原生SQL设置参数    models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])    # 将获取的到列名转换为指定列名    name_map = {'age': 'new_age', 'name': 'new_name'}    r = models.UserInfo.objects.raw('SELECT * FROM app01_userinfo', translations=name_map)    for i in r:        print(i.new_age)    # 指定数据库    # models.UserInfo.objects.raw('select * from userinfo', using="default")
原创粉丝点击