40.Django之ORM操作数据库

目录

1.orm简单介绍

2.orm用法与字段类型

3.orm的元选项与管理器对象

4.ORM之查询操作(查询集、过滤器)

5.orm之字段中数据的增删改查


1.orm简单介绍

1.ORM全称:Object-Relation Mapping
     意为:对象-关系映射
2.作用:对数据库的操作都转化成对类属性和方法的操作,不用写SQL语句(当然也有缺点)
3.在Django的app应用中model.py文件是数据的单一、明确的信息来源。通常一个模型(model)映射到一个数据库表。
4.映射关系:
    ORM              数据库
    类		=======	 数据表
    对象	=======	 数据行
	对象属性 =======  字段

5.非常重要:数据库迁移命令
    只要修改model.py与数据库相关代码,都要执行以下两条命令:
    (1)python manage.py makemigrations    # 将操作记录记录到小本本上(migrations文件夹)
    (2)python manage.py migrate           # 将操作真正的同步到数据库中

2.orm用法与字段类型

1.orm用法:属性名 = models.字段类型()

2.常见字段类型
    (1)AutoField:    自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性
    (2)IntegerField: 整数
    (3)FloatField():浮点数
    (4)DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数
                                                        max_digits:总位数
                                                        decimal_places:小数位数
    (5)CharField(max_length=20):字符串(max_length:最大字符个数)
                                 必须要指定max_length参数 不指定会直接报错
    (6)TextFiled:         大文本字段,一般超过4000个字符时使用
    (7)BooleanField:      布尔字段,值为True或False
    (8)NullBooleanField:  支持Null、True、False三种值                                       
    (9)DateField(auto_now=False, auto_now_add=False):日期
                参数auto_now:每次保存对象时,自动设置该字段为当前时间,
                              用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
                参数auto_now_add:当对象第一次被创建时自动设置当前时间,
                              用于创建的时间戳,它总是使用当前日期,默认为false
                注意:参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
    (10)TimeField(auto_now=False, auto_now_add=False):时间
    (11)DateTimeField:日期时间
    (12)FileField:上传文件字段,以二进制的形式
    (13)ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片


3.常见字段属性(选项)
    (1)null:如果为True,表示允许为空,默认值是False
    (2)blank:如果为True,则该字段允许为空白,默认值是False    
             对比:null是数据库范畴的概念,blank是表单验证范畴的
    (3)db_column:字段的名称,如果未指定,则使用属性的名称
              (只限于数据库表中的名字,操作数据库还是类属性的名字)
    (4)db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )
    (5)default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。
    (6)primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
    (7)unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False
    (8)verbose_name:该参数是所有字段都有的 就是用来对字段的解释


4.关系字段类型(用法与普通字段类型一样)
    关系型数据库的关系包括三种类型:
        ForeignKey:        一对多,将字段定义在多的一端中
        ManyToManyField:   多对多,将字段定义在任意一端中
        OneToOneField:     一对一,将字段定义在任意一端中


5.字段的的增删改(记得执行数据库迁移的两条命令):
    (1)字段的增加
	    a.可以在终端内直接给出默认值
        b.该字段可以为空
            info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
        c.直接给字段设置默认值
            hobby = models.CharField(max_length=32,verbose_name='兴趣爱
好',default='study')
        然后执行数据库迁移的两条命令
    (2)字段的修改
	   直接修改代码然后执行数据库迁移的两条命令即可!
    (3)字段的删(慎重)
	   直接注释对应的字段然后执行数据库迁移的两条命令即可!
       注意:执行完毕之后字段对应的数据也都没有了

3.orm的元选项与管理器对象

1.元选项:
    (1)元选项作用:修改数据库表的默认的名称
    (2)元选项用法:
       在models.py中创建类时:
        class User(models.Model):                      # 数据库表的默认名称为模型名app_User
            username = models.CharField(max_length=20) # 用户名
            class Meta:                                # 用Meta定义元信息类
                db_table = 'userimfor'                 # db_table=""自定义表的名字



2.管理器对象
    (1)在models.py中创建类后,Django默认生成管理器对象objects,在views.py中与数据库交互时
       直接用"objects.属性"的方式访问数据库。
    (2)在models.py创建类时,可以自定义管理器对象名,不用使用objects,用法如下:
        class User(models.Model):                      # 数据库表的默认名称为模型名app_User
            username = models.CharField(max_length=20) # 用户名
            class Meta:                                # 用Meta定义元信息类
                db_table = 'userimfor'                 # db_table=""自定义表的名字
            Users = models.Manager()                   # Manager()自定义管理器对象
        注意:objects是Manager类型的对象,Django不会默认生成管理器对象objects

4.ORM之查询操作(查询集、过滤器)

1.基本概念
    (1)查询集:表示从数据库中获取的模型对象集合(objects.),在管理器上调用过滤器方法会返回查询集
               查询集可以含有0个、一个或多个过滤器
       查询集特点:a.惰性执行:创建查询集不会访问数据库,直到在模板中调用数据时,才会访问数据库
                             调用数据的情况包括迭代、序列化、与if合用
                 b.缓存:查询集的结果被存下来之后,再次查询相同数据时会使用之前缓存的数据
    (2)过滤器:基于所给的参数限制查询的结果



2.过滤器分两类
    (1)返回列表数据的过滤器:
        all():       返回所有的数据(以对象形式)
        filter():    返回满足条件的数据,括号内可以携带多个参数,参数与参数之间默认是and关系
        exclude():   返回满足条件之外的数据,相当于sql语句中where部分的not关键字
        order_by():  返回排序后的数据
        注意:返回的是列表对象,即[数据对象1,数据对象2...],
              获取对象,它支持索引取值和切片操作,但是不支持负数索引
              获取第一个对象filter().first()
    (2)返回单个对象的过滤器:
        get():       返回单个满足条件的对象
                      # 如果未找到会引发"模型类.DoesNotExist"异常
                      # 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
        count():     返回当前查询的总条数
        aggregate(): 聚合
        exists():    判断查询集中是否有数据,如果有则返回True,没有则返回False



3.利用过滤器进行件查询案例
    (1)前设登录网页:
        models.py文件中创建类(数据库)
            class User(models.Model):
                id = models.AutoField(primary_key=True, verbose_name='主键')
                        # 相当于SQL语句:id int primary_key auto_increment
                username = models.CharField(max_length=32, verbose_name='用户名')
                        # 相当于SQL语句:username varchar(32)
                password = models.IntegerField(verbose_name='密码')
                        # 相当于SQL语句:password int
                age = models.IntegerField(verbose_name='年龄')
                info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
                         # 年龄该字段默认为空
                hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
                         # 直接给兴趣爱好字段设置默认值study

        views.py文件中查询数据,通过模型对象objects.过滤器(条件)拿到数据
            from django.shortcuts import render, HttpResponse
            from app01 import models                # 导入数据库交互文件
            def login(request):                     # 返回登录页面函数
                if request.method == 'POST':        # 判断用户post提交数据
                    username = request.POST.get('username')
                    password = request.POST.get('password')
                        # 拿到login.html文件form表单返回的username/password
                    user_obj = models.User.objects.filter(username=username).first()
                        # 通过models.py文件的User类生成的管理器对象objects,
                        # 再以filter()过滤器,并且username=username为条件,返回列表数据行
                        # 最后first(),拿到第一个数据对象,赋以user_obj
                        # 也就是说此时user_obj就是数据行,通过.的方式可以访问到数据库对应数据
                    if user_obj:                             # 如果数据行存在
                        if password == user_obj.password:    # 校验密码
                            return HttpResponse("登陆成功")
                        else:
                            return HttpResponse("密码错误")
                    else:
                        return HttpResponse("用户不存在")
                return render(request, 'login.html')         # 非post请求,返回login.html
            注意:在写代码时,注意哪些是要大写的(大小写要区分)


    (2)常见过滤器查询:
        a.查询id为1的用户名(用exact:判断是否相等)
            usernames = models.User.objects.filter(id__exact=1)

        b.查询姓名中包含'张'的名字(用contains:是否包含)
            usernames = models.User.objects.filter(username__contains='张')

        c.查询姓名中以‘欣’结尾的名字(用startswith/endswith:以什么开头/以什么结尾)
            usernames = models.User.objects.filter(username__endswith='欣')

        d.查询姓名不为空的成员(用isnull : 是否为null)
            usernames = models.User.objects.filter(username__isnull=False)

        e.查询编号为2或4的成员(pk:主键/id) (用in:是否包含在范围内)
            usernames = models.User.objects.filter(pk__in=[2,4])

        f.查询编号大于2的成员(gt:大于、gte:大于等于、lt:小于、lte:小)
            usernames = models.User.objects.filter(id__gt=2)
 
        g.查询id不等于3的成员(exclude:条件以外的数据)
            usernames = models.User.objects.exclude(id=3)

        h.查询2020年注册的成员(year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算)
            usernames = models.User.objects.filter(pub_date__year=2020)

        i.查询2020年1月1日后注册的成员
            from datetime import date
            usernames = models.User.objects.filter(pub_date__gt=date(2020,1,1))

5.orm之字段中数据的增删改查

在views.py中对数据库数据的增删改查
from app01 import models
1.查数据
    # 方式一
        res = models.User.objects.filter(username=username)
            """
            返回值你先看成是列表套数据对象的格式
            它也支持索引取值,切片操作,但是不支持负数索引
            它也不推荐你使用索引的方式取值
            user_obj = models.User.objects.filter(username=username).first()
            filter括号内可以携带多个参数 参数与参数之间默认是and关系
            """
        return render(request,'userlist.html',{'user_queryset':user_queryset})    # 指定返回
    # 方式二
        user_queryset = models.User.objects.all()
        return render(request,'userlist.html',locals())    # 全部返回


2.增数据
    # 方法一:
    res = models.User.objects.create(username=username,password=password)  # 返回值就是当前被创建的对象本身
    # 方法二:
    user_obj = models.User(username=username,password=password)
    user_obj.save()              # 保存数据/对象调用save方法


3.删数据
    models.User.objects.filter(id_user=1).delete()    # 指定删除id_user=1的数据


4.改数据
    # 方式一:
    models.User.objects.filter(id=edit_id).update(username=username,password=password)
        # 将filter查询出来的列表中所有的对象全部更新,批量更新操作,只修改被修改的字段
    # 方式二:
    edit_obj.username = username
    edit_obj.password= password
    edit_obj.save()
        # 用重新赋值方式,全部逐一更换当字段特别多的时候效率会非常的低
        # 因为从头到尾,无论该字段是否被修改都将数据的所有字段全部更新一边 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django自带的ORM是一个Python对象关系映射工具,它可以让开发者使用Python语言进行数据库操作,而不需要手写SQL语句。 使用Django自带的ORM进行数据库操作的步骤如下: 1. 定义模型类:在Django应用的models.py文件中定义模型类,其中每个模型类对应一个数据库表。 2. 进行迁移:运行python manage.py makemigrations命令生成数据库迁移文件,再运行python manage.py migrate命令将模型类映射到数据库表。 3. 进行CRUD操作:使用模型类提供的方法进行数据库的增删改查操作,如: - 创建对象:使用模型类的save()方法或create()方法创建新的数据库记录。 - 查询对象:使用模型类的objects属性进行查询,可以使用filter()、get()、all()等方法进行过滤和排序。 - 更新对象:使用模型类的save()方法或update()方法更新数据库记录。 - 删除对象:使用模型类的delete()方法删除数据库记录。 示例代码: ```python # 定义模型类 from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) price = models.DecimalField(max_digits=5, decimal_places=2) pub_date = models.DateField() is_published = models.BooleanField(default=True) # 创建对象 book = Book(title='Python入门', author='张三', price=29.99, pub_date='2022-01-01') book.save() # 查询对象 books = Book.objects.filter(author='张三').order_by('-price') for book in books: print(book.title, book.price) # 更新对象 book.price = 39.99 book.save() # 删除对象 book.delete() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值