zoukankan      html  css  js  c++  java
  • django orm 操作表

    django orm 操作表

    1、基本操作

    models.Tb1.objects.create(c1='xx', c2='oo')  增加一条数据,可以接受字典类型数据 **kwargs
    insert into Tb1 (c1,c2) values ('xx','00')
    obj = models.Tb1(c1='xx', c2='oo')
    obj.save()
    insert into Tb1 (c1,c2) values ('xx','00')
    
    # 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)
    models.Tb1.objects.get(id=123)         # 获取单条数据,不存在则报错(不建议)
    select * from Tb1 where id=123 limit 1
    models.Tb1.objects.all()               # 获取全部
    select * from Tb1
    models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
    select * from Tb1 where name='seven'
    
    # exists()
    # 检查查询结果是否存在,返回True或False
    result = models.UserInfo.objects.filter(id=1111).exists()
    print(result)
    models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
    delete from Tb1 where name='seven'
    
    
    models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均支持 **kwargs
    update Tb1 set gender='0' where name='seven'
    obj = models.Tb1.objects.get(id=1)
    obj.c1 = '111'
    obj.save()                                                 # 修改单条数据
    update Tb1 set c1 = '111' where id=1
     

    2、进阶操作(了不起的双下划线)

    利用双下划线将字段和对应的操作连接起来

    • 获取个数

        models.Tb1.objects.filter(name='seven').count()
        select count(*) from Tb1 where name='seven'
    • 大于,小于

        models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
        select * from Tb1 where id>1
        models.Tb1.objects.filter(id__gte=1)              # 获取id大于等于1的值
        select * from Tb1 where id>=1
        models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
        select * from Tb1 where id<10
        models.Tb1.objects.filter(id__lte=10)             # 获取id小于等于10的值
        select * from Tb1 where id<=10
        models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
        select * from Tb1 where id<10 and id>1
    • in

       models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
        select * from Tb1 where id in (11, 22, 33)
        models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
        select * from Tb1 where id not in (11, 22, 33)
    • isnull

       Entry.objects.filter(pub_date__isnull=True)
        select * from Tb1 where pub_date is null
    • contains

      models.Tb1.objects.filter(name__contains="ven")
        select * from Tb1 where name like binary '%ven%'
        models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
        select * from Tb1 where name like  '%ven%'
        models.Tb1.objects.exclude(name__icontains="ven")
        select * from Tb1 where name not like '%ven%'
    • range

       models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
        select * from Tb1 where id bettwen 1 and 2
    • 其他类似

      startswith,istartswith, endswith, iendswith,
        startswith select * from Tb1 where name like  'ven%'
        endswith  select * from Tb1 where name like  '%ven'
    • order by

       models.Tb1.objects.filter(name='seven').order_by('id')    # asc
        select * from Tb1 where name='seven' order by id asc
        models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
        select * from Tb1 where name='seven' order by id desc
    • group by

        from django.db.models import Count, Min, Max, Sum
        models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
        SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
    • limit 、offset

        models.Tb1.objects.all()[10:20]
        select * from Tb1 limit 10,20
    • regex正则匹配,iregex 不区分大小写

        Entry.objects.get(title__regex=r'^(An?|The) +')
        select * from Entry where title regexp binary "^(An?|The) +"
        Entry.objects.get(title__iregex=r'^(an?|the) +')
        select * from Entry where title regexp "^(An?|The) +"
    • date

        Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
        Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
    • year

        Entry.objects.filter(pub_date__year=2005)
        Entry.objects.filter(pub_date__year__gte=2005)
    • month

        Entry.objects.filter(pub_date__month=12)
        Entry.objects.filter(pub_date__month__gte=6)
    • day

        Entry.objects.filter(pub_date__day=3)
        Entry.objects.filter(pub_date__day__gte=3)
    • week_day

        Entry.objects.filter(pub_date__week_day=2)
        Entry.objects.filter(pub_date__week_day__gte=2)
    • hour

        Event.objects.filter(timestamp__hour=23)
        Event.objects.filter(time__hour=5)
        Event.objects.filter(timestamp__hour__gte=12)
    • minute

        Event.objects.filter(timestamp__minute=29)
        Event.objects.filter(time__minute=46)
        Event.objects.filter(timestamp__minute__gte=29)
    • second

        Event.objects.filter(timestamp__second=31)
        Event.objects.filter(time__second=2)
        Event.objects.filter(timestamp__second__gte=31)

    3、其他操作

    • extra

       extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
       Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
       Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
       Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
       Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
    • F

        from django.db.models import F
        models.Tb1.objects.update(num=F('num')+1)
        update Tb1 set num=num+1
    • Q

        from django.db.models import Q
        方式一:
        Q(nid__gt=10)
        Q(nid=8) | Q(nid__gt=10)
        select * from table where nid=8 or nid>10
        Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
        select * from Tb1 where (nid=8 or nid>10) and caption='root'
        方式二:
        con = Q()
        q1 = Q()
        q1.connector = 'OR'
        q1.children.append(('id', 1))
        q1.children.append(('id', 10))
        q1.children.append(('id', 9))
        q2 = Q()
        q2.connector = 'OR'
        q2.children.append(('c1', 1))
        q2.children.append(('c1', 10))
        q2.children.append(('c1', 9))
        con.add(q1, 'AND')
        con.add(q2, 'AND')
      
        models.Tb1.objects.filter(con)
        select * from Tb1 where ( id=1 or id=10 or id=9 ) and ( c1=1 or c1=10 or c1=9 )
    • 执行原生SQL

        from django.db import connection, connections
        cursor = connection.cursor()  # cursor = connections['default'].cursor()
        cursor.execute("""SELECT * from auth_user where id = %s""", [1])
        row = cursor.fetchone()

    4、连表操作(了不起的双下划线)

    利用双下划线和 _set 将表之间的操作连接起来

    • 表结构实例
    class UserProfile(models.Model):
        user_info = models.OneToOneField('UserInfo')
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=64)
    
        def __str__(self):
            return self.username
    
    
    class UserInfo(models.Model):
        user_type_choice = (
            (0, '普通用户'),
            (1, '高级用户'),
        )
        user_type = models.IntegerField(choices=user_type_choice)
        name = models.CharField(max_length=32)
        email = models.CharField(max_length=32)
        address = models.CharField(max_length=128)
    
        def __str__(self):
            return self.name
    
    
    class UserGroup(models.Model):
    
        caption = models.CharField(max_length=64)
    
        user_info = models.ManyToManyField('UserInfo')
    
        def __str__(self):
            return self.caption
    
    
    class Host(models.Model):
        hostname = models.CharField(max_length=64)
        ip = models.GenericIPAddressField()
        user_group = models.ForeignKey('UserGroup')
    
        def __str__(self):
            return self.hostname
    • 一对一操作

        user_info_obj = models.UserInfo.objects.filter(id=1).first()
        print (user_info_obj.user_type)
        select user_type drom UserInfo where id=1 limit 1
        print (user_info_obj.get_user_type_display())
        print (user_info_obj.userprofile.password)
        select userprofile.password from userprofile,UserInfo where UserInfo.id=1 and UserInfo.id=userprofile.user_info
        
        user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
        select email, userprofile.username from UserInfo,userprofile where UserInfo.id=1 and UserInfo.id=userprofile.user_info
        print (user_info_obj.keys())
        print (user_info_obj.values())
    • 一对多

        类似一对一
        1、搜索条件使用 __ 连接
        2、获取值时使用 .    连接
      
    • 多对多操作

        user_info_obj = models.UserInfo.objects.get(name=u'武沛齐')
        user_info_objs = models.UserInfo.objects.all()
        
        group_obj = models.UserGroup.objects.get(caption='CEO')
        group_objs = models.UserGroup.objects.all()
        
        # 添加数据
        group_obj.user_info.add(user_info_obj)
        group_obj.user_info.add(*user_info_objs)
        
        # 删除数据
        group_obj.user_info.remove(user_info_obj)
        group_obj.user_info.remove(*user_info_objs)
        
        # 添加数据
        user_info_obj.usergroup_set.add(group_obj)
        user_info_obj.usergroup_set.add(*group_objs)
        
        # 删除数据
        user_info_obj.usergroup_set.remove(group_obj)
        user_info_obj.usergroup_set.remove(*group_objs)
        
        # 获取数据
        print group_obj.user_info.all()
        print group_obj.user_info.all().filter(id=1)
        
        # 获取数据
        print user_info_obj.usergroup_set.all()
        print user_info_obj.usergroup_set.all().filter(caption='CEO')
        print user_info_obj.usergroup_set.all().filter(caption='DBA')
  • 相关阅读:
    构建之法8,9,10章
    作业6
    通过处理器类型获得处理器对象
    面经
    C语言实现字符串替换
    计算机网络整理
    常见面试题
    数据库常见面试题
    redis常见知识整理
    项目总结
  • 原文地址:https://www.cnblogs.com/jiangwenhui/p/10154031.html
Copyright © 2011-2022 走看看