Django-ORM进阶操作02

  • 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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值