zoukankan      html  css  js  c++  java
  • django的OMR

    django的orm

    创建模型(model)的步骤

    1.创建数据库

    2.setting中配置连接

    ​ 主文件中

    DATABASES = {
    	# 'default': {
    	#     'ENGINE': 'django.db.backends.sqlite3', ### 非常小型的文件数据库
    	#     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    	# }
    
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',  ## 数据库名称
        'USER': 'root',
        'PASSWORD': '',  ## 安装 mysql 数据库时,输入的 root 用户的密码
        'HOST': '127.0.0.1',
        }
        }
    

    3.连接数据库

    ​ 在对应app中的_ init _ 文件下面

    import pymysql
    pymysql.install_as_MySQLdb()
    

    4.添加文件

    ​ 主文件的setting中添加对应的app

        'django.contrib.admin',   
        'django.contrib.auth',   
        'django.contrib.contenttypes',   
        'django.contrib.sessions',   
        'django.contrib.messages',   
        'django.contrib.staticfiles',   
        'app01',   
        'classes'
        ]
    

    orm基本的增删改查

    创建表

    ​ 在app对应的models.py文件中

    from django.db import models
    
    # Create your models here.
    
    # 一个class对应一个表
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32,null=True)
        age = models.IntegerField(null = True)
    

    ​ 转换成实际的表(在terminal中执行)

    python manage.py  makemigrations  ### 生成迁移文件
    python manage.py  migrate   ### 生成实际的表
    

    添加

    # 单条添加
    models.Test.objects.create(name='jerry',age=18)
    
    # 多条添加
    info = [
    	models.Test(name='qqq',age=21),
    	models.Test(name='zzz',age=22),
    	models.Test(name='lll',age=23)
    	]
    models.Test.objects.bulk_create(info)
    

    删除

    models.Test.objects.filter(id=3).delete()
    

    更新

    models.Test.objects.filter(id=5).update(name="xxx")
    

    查询

    res = models.Test.objects.all()
    for object in res:
    	print(object.name)
    
    # 列表套字典形式
    res = models.Test.objects.values('name','age')
    print(res)
    
    # 列表套元祖
    res = models.Test.objects.values_list('name','age')
    print(res)
    
    # where条件查询
    # id = 1
    res = models.Test.objects.filter(id=1)
    print(res)
    # id > 3
    res = models.Test.objects.filter(id__gt=3)
    print(res)
    
    
    

    联表查询

    students表的cid关联classes表的id

    # 正向查询
    def Students(request):
        res = models.students.objects.all()
        for object in res:
            print(object.name,object.cid.name)
            
    # 反向查询      
    res = models.classes.objects.all()
    for object in res:
    	print(object.id,object.students_set.all())
    	print(object.id,object.students.all())  # 取别名与_set的方式不能同时存在
    

    查询大全

    # 字段where条件查询
    res = models.classes.objects.filter(id__gt=3)  # id > 3
    res = models.classes.objects.filter(id__gte=3)    # id >= 3
    res = models.classes.objects.filter(id__lte=3)    # id < 3
    res = models.classes.objects.filter(id__lt=3)	  # id <= 3
    res = models.classes.objects.exclude(id=4)		# id != 4    
    res = models.UserInfo.objects.filter(id=2, name='nick')    # 满足多个条件查询 
    
    
    # in, not in
    res = models.classes.objects.filter(id__in=[1,2,3,4])    # 在这几个里面
    res = models.classes.objects.exclude(id__in=[1,2])   	# 不在这几个里面
    
    
    # between and
    res = models.classes.objects.filter(id__range=[2,3])  # 取值包括边界
    
    
    # 以...开头,以..结尾
    res = models.classes.objects.filter(name__startswith='p')  # 以..开头
    res = models.classes.objects.filter(name__endswith='期')   # 以..结尾
    
    
    # 忽略大小写
    res = models.classes.objects.filter(name__istartswith='P')    # 前面加"i"的都是忽略大小写
    
    
    # where name like '%3%'
    res = models.classes.objects.filter(name__contains='3')   # 包含某个字符串
    
    
    # 正则表达式
    res = models.classes.objects.filter(name__regex='^p9$')
    
    
    # sum,count,max.min
    from django.db.models import Count, Min, Max, Sum
    
    rex = models.classes.objects.values('name').annotate(s=Sum('id'))  # 以name分组求id的和
    rex = models.classes.objects.values('name').annotate(s=Sum('id')).filter(students__id__gt=1) # 以name分组,求id>1的和
    
    rex = models.classes.objects.values('name').annotate(a=Max('id')) # 以name分组求id的最大值
    rex = models.classes.objects.values('name').annotate(a=Max('id')).filter(students__id__gt=1) # 以name分组,求id>1的的最大数
    
    rex = models.classes.objects.values('name').annotate(i=Min('id')) # 以name分组求id的最小值
    rex = models.classes.objects.values('name').annotate(i=Min('id')).filter(students__id__gt=1) # 以name分组,求id>1的的最小数
    
    res = models.classes.objects.filter(id__gt=1).count()  # id > 1 计数
    
    
    # limit
    res = models.classes.objects.all()[1:3]   # 顾尾不顾头
    
    
    # 最后一个
    res = models.classes.objects.last() 
    
    # 查找第一个
    res = models.Test.objects.first()
    
    
    # only
    res = models.classes.objects.only('name')   # 只查询一项,但默认会带上id
    
    # defer
    res = models.classes.objects.defer('id')   # 除某一项不查,其余都查,默认会带上id
    
    
    # Q    |:or    &:and
    from django.db.models import Q
    res = models.students.objects.filter(Q(Q(id__gt=3) | Q(name='张三')) & Q(cid=2))   
    
    
    # F
    from django.db.models import F
    res = models.students.objects.update(cid=F('cid')+1)  给数字类型加减值
    
    
    # 升序降序
    models.UserInfo.object.all().order_by('id')    # 默认是升序,前面加“-”是降序
    models.UserInfo.object.all().order_by('-id', 'name')     # 多个排序
    

    原生sql语句

    from django.db import connection,connections
    cursor = connection.cursor()
    cursor.execute("")   # sql语句
    row = cursor.fetchone
    print(row)
    
  • 相关阅读:
    EntityFramework Code-First 简易教程(五)-------领域类配置
    EntityFramework Code-First 简易教程(四)-------继承策略
    Springboot整合mybatis:Invalid bound statement (not found)
    centos7服务器安装mysql8
    redis-Jedis
    redis学习-集群模式cluster
    redis学习-发布订阅
    redis学习-持久化机制
    redis学习-简单事务
    redis学习-哨兵模式
  • 原文地址:https://www.cnblogs.com/einsam/p/11400088.html
Copyright © 2011-2022 走看看