• Django-ORM


    Django的orm

    1. 创建模型的步骤

    步骤一:需要创建一个数据库

    步骤二:settings中配置连接

    DATABASES = {
        	# sqlites:是非常小型的文件数据库
    	'default':{
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day55',  # 数据库名称
            'USER': 'root',  # 用户名
            'PASSWORD': '123',  # 连接数据库的密码
            'HOST': '127.0.0.1',  
        }
    }
    

    步骤三:在对应的app中的__init__文件下面配置:要使用pymysql去连接数据库

    # python3
    import pymysql
    pymysql.install_as_MySqldb()
    
    # MYSQL-python是python2连接数据库的包
    

    步骤四:在settings中的INSTALLED_APPS中加上app

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'classes.apps.ClassesConfig',
        'classes',
        'teachers',
        'students',
    ]
    

    2.模型的创建

    在models.py文件中创建表,一个类对应一张表

    # 创建表
    from django.db import models
    
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)  # 主键,自增长
        name = models.CharField(max_length=32,null=True)  # varchar(32),可为空
        age = models.CharField(max_length=32,null=True)
        # 一对多,to:关联表 to_field:关联哪个字段。不写就默认关联id
        ut = model.ForeignKey(to="UserType")
        # 此时会在Userinfo里添加一列ut_id,ut代表关联的UserType的一行一行数据对象,ut_id就是关联的外键的值
         
    class UserType(models.Model):
        # 不写id这一行代码的时候,会自动添加id自增这一列
        title = models.CharField(max_length=32,null=True)
        
    # 将类转换成实际的表,注意:在models中修改任意一条代码都要重新执行上面两条命令
    python manage.py makemigrations  # 生成
    python manage.py migrate  # 
    
     # 在原有基础上增加外键对应关系时,遇到以下问题
    You are trying to add a non-nullable field 'ut' to classes without a default; we can't do that (the database needs som
    ething to populate existing rows).
    Please select a fix:
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py
    Select an option: 2
     1)在命令行上添加一个值
     2)退出,自己在model.py里添加默认的值:ut=model.ForeignKey(to="UserType",null=True)(推荐使用2)
    

    3.orm单表的增删改查

    # 在view.py文件中增删改查,在url中配置下路由
    from app01 import models  # 先导入要用到的模型
    
    def ormtest(request):
        
        # 查询
        
        res = models.UserInfo.objects.all()  # 查询的所有数据
        # res的结果是queryset类型,以列表的形式包含对象,可以同过for循环取值<QuerySet [<Classes: Classes object>,<Classes: Classes object>]> 
        # res的类型<class 'django.db.models.query.QuerySet'>
        for obj in res:
            print(obj.age, obj.name)
            
        res = models.UserInfo.objects.values('name','age') # 只查询想获取的列名,返回的结果是列表里面套字典
        
        res = models.UserInfo.objects.value_list('name','age')  # 只查询想获取的列名,返回的是列表套元组
        
        res = models.UserInfo.objects.first()  # 查询第一个值,返回是的是单个对象
        
        res = models.UserInfo.objects.filter(id__gt=3).all()  # 条件查询id__gt=3表示where id>3,id__gte=3表示where id>=3。返回的结果是列表套对象
        
        # 增加
        # 第一种增加方式
        models.UserInfo.objects.create(name='kkk',age=13,ut_id=1)
        # 第二种用字典的格式
        userInfo = {"name":'sss','age':12,'ut_id':2}
        models.UserInfo.objects.create(**userInfo)
        # 添加多条数据
        userinfo = [
            models.UserInfo(name='root1',age=18),
            models.UserInfo(name='root2',age=19),
            models.UserInfo(name='root3',age=20)
            ]
        models.UserInfo.objects.bulk_create(userinfo)
        
        # 删除
        models.UserInfo.objects.filter(id=3).delete()
        
        # 更新
        models.UserInfo.objects.filter(id=3).update(name='ddsd')
        
        return HttpResponse('ok')
    

    4.一对多表的正向查询和反向查询

    # 正向查询
    # 获取某一用户所对应的用户类型
    res = models.UserInfo.objects.all()
    for obj in res:
        print(obj.name,obj.age,obj.ut.title)  # ut是关联表的一行一行数据的对象,通过ut跨到主表查询
    models.UserInfo.objects.values('name','age','ut__title')
    models.UserInfo.objects.values_list('name','age','ut__title')
    
    # 反向查询 表名小写_set
    # 获取所有用户类型下面的用户
    res = models.UserType.objects.all()
    for obj in res:
        print(obj.id,obj.title,obj.userinfo_set.all())
        # obj.userinfo_set.all() 相当于models.UserInf.object.filter(ut_id=a).all()
    
    # 使用表名小写__字段名
    res = models.UserType.objects.values('title','userinfo__id','userinfo__name','userinfo__age')  
    
    
  • 相关阅读:
    [LeetCode] 493. Reverse Pairs 翻转对
    [LeetCode] Super Washing Machines 超级洗衣机
    [LeetCode] Perfect Number 完美数字
    [LeetCode] 483. Smallest Good Base 最小的好基数
    [LeetCode] Sliding Window Median 滑动窗口中位数
    [LeetCode] Diameter of Binary Tree 二叉树的直径
    [LeetCode] 01 Matrix 零一矩阵
    [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树
    [LeetCode] Reverse String II 翻转字符串之二
    [LeetCode] Minimum Time Difference 最短时间差
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11349173.html
Copyright © 2020-2023  润新知