12、 Django-模型models的基本操作-增删改查

一般的数据库操作流程:
1、创建数据库,设计表结构和字段
2、连接Mysq1数据库,并编写数据访问层代码
3.业务逻辑层去调用数据访问层执行数据库操作

Diango通过Mode1操作数据库,不管你数据库的类型是MySql或者Sqlite,
Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Diango帮我们自动完成。只要会写Mode1就可以了。
django使用对象关系映射(0bject Relational Mapping,简称ORM)框架去操控数据库。
ORM(0biect Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

 

管理器:

 

自定义QuerySet的输出格式-就是返回输出模型类中的字段的格式:

 

#ORM :对象关系映射
    模型   《==》  表
    类结构  《==》  表结构
    对象   《==》  表的一条数据
    类属性  《==》  表的字段

models基本操作

数据库的增删改查

#增

#增
1、创建实例对象、然后调用save方法
    obj = Author()
    obj.first_name = 'zhang'
    obj.last_name = 'san'
    obj.save()

2、创建对象并初始化、再调用save方法:
    obj = Author(first_name='zhang', last_name='san')
    obj.save()

3、使用create方法
    Author.objects.create(first_name='lo', last_name='si')

4、使用get_or_create方法、可以防止重复
    Author.objects.get_or_create(first_name='zhang', last_name='san')

#如
models.py
------------------------------------------------------------------------
from django.db import models

#增删改查
class PersonModel(models.Model):
    name = models.CharField(max_length=30, unique=True)
    age = models.IntegerField(default=18)

    #创建表
    class Meta:
        #表名
        db_table = 'tb_person'
        
        
    #将值打印出来、而不是显示模型对象 <PersonModel: PersonModel object (9)>
    def __str__(self):
        return f'{self.name} - {self.age}'

    def __repr__(self):
        return f'{self.name} - {self.age}'

#ORM : 对象关系映射
#模型类class  --> 对应数据库中的-->  表结构
#类属性(name\age...)  --> 对应数据库中的-->  表字段
#一个对象(在视图函数中操作) --> 对应数据库中的-->  表的一条数据
----------------------------------------------------------------------------------------------------

views.py
----------------------------------------------------------------------------------------
from django.shortcuts import render
from App_models.models import *
from django.http import HttpResponse
# Create your views here.


#增加数据
def add_person(request):
    # #方式一:
    # try:
    #     p = PersonModel()
    #     p.name = '阿新'           #name字段设置成了unique 唯一性、不能重复新增
    #     p.age = 20
    #     p.save()    #同步数据到数据库中
    # except Exception as e:
    #     return HttpResponse('add False!!!')
    # return HttpResponse('add successfully')

    # 方式二:
    # try:
    #     p = PersonModel(name='xjj', age=25)     # name字段设置成了unique 唯一性、不能重复新增
    #     p.save()  # 同步数据到数据库中
    # except Exception as e:
    #     return HttpResponse('add False!!!')
    # return HttpResponse('add successfully')

    # # 方式三:
    # try:
    #     PersonModel.objects.create(name='小新', age=22)
    # except Exception as e:
    #     return HttpResponse('add False!!!')
    # return HttpResponse('add successfully')

    # 方式四:
    # try:
    #     #PersonModel.objects.get_or_create  是有返回值的  True或False
    #     ret = PersonModel.objects.get_or_create(name='温工', age=22)
    #     print('ret:',ret)   #ret: (<PersonModel: PersonModel object (5)>, False)    返回值
    # except Exception as e:
    #     return HttpResponse('add False!!!')
    # return HttpResponse('add successfully')

    #批量增加for循环
    for i in range(10, 20):
        PersonModel.objects.create(name=f'吴{i}坊', age=i)

    return HttpResponse('add successfully!')

---------------------------------------------------------------------------------------------------------------

根路由urls.py
--------------------------------------------------------------------------------
from django.contrib import admin
from django.urls import path
from App_models.views import *
urlpatterns = [

    path('add/', add_person, name='addperson'),

    path('admin/', admin.site.urls),
]
-------------------------------------------------------------------------

 

#删

views.py
----------------------------------------------------------------------------------------------------
def del_person(request):
    #删除数据
    #1、先找到要删除的数据
    #2、再执行删除

    try:
        #删除一条数据
        # p = PersonModel.objects.first() #表中的第一条数据
        # p = PersonModel.objects.last()  # 表中的最后一条数据
        # p.delete()

        #删除多条数据
        #.filter 过滤
        #age__gt=15     表示 age>15的数据
        PersonModel.objects.filter(age__gt=15).delete()     #删除age大于15的数据

    except Exception as e:
        return HttpResponse('删除失败')

    return HttpResponse('删除成功')

 

#修改

views.py
------------------------------------------------------------------
#修改数据
def update_person(request):
    #修改数据
    #1、先找到要修改的数据
    #2、再修改


    try:
        # 修改一条数据
       p = PersonModel.objects.first()      #找到第一条数据
       p.age = 56
       # p.save()     #同步到数据库中
       p.save(update_fields=['age'])    #修改指定的字段、提高效率

        # 修改多条数据
       # PersonModel.objects.all().update(age=100)    #将所有数据的age值改为100

    except Exception as e:
        return HttpResponse('修改失败')
    return HttpResponse('修改成功')

 

#查

官网详细:https://docs.djangomroject.com/en/2.2/ref/models/querysets/#field-lookups

views.py
-----------------------------------------------------------------------------------------------
#查询  # print(persons.query)    #返回sql语句
def get_person(request):
    # #get():得到一个对象(一条数据) -- 放回object对象 不是QuerySet
    # # 如果不存在id=6的数据、就会报错所以get()必须要指定已存在的数据:报错-模型类错误.DoesNotExist异常
    # # 有且只能匹配一条数据、多条数据也会报错:报错模型类.MultipleObjectsReturned异常
    # p = PersonModel.objects.get(id=6)
    # p = PersonModel.objects.get(pk=6)   #pk :primary key 主键  这样写也是可以的
    #
    # print('*' * 60)
    # print(p, type(p))       #p为模型中的PersonModel对象
    # print(p.name, p.age)
    # print('*' * 60)

    # all() 获取所有的数据(返回值是QuerySet-[<实例化的对象>])  == select * from table_name;
    #返回一个查询集、可遍历
    persons = PersonModel.objects.all()
    print(persons, type(persons))

    #遍历查询集
    for person in persons:
        print(person.name, person.age)
        
    #values(字段名1, 字段名2, ...)-查询指定字段的数据(返回值-QuerySet[{字典},]) == select 字段名1, 字段名2 from table_name;
    persons = PersonModel.objects.values('name', 'age')
    for person in persons:
        print(person['name'], person['age'])
            
    #values_list(字段名1, 字段名2, ...)-查询指定字段的数据(返回值-QuerySet[(元组),])== select 字段名1, 字段名2 from table_name;
    persons = PersonModel.objects.values('name', 'age')
        for person in persons:
            print(person[0])    #使用下标取值
            

    #first()  :第一条数据
    f = PersonModel.objects.first()
    print(f.name, f.age)
    #last():最后一条数据
    l = PersonModel.objects.last()
    print(l.name, l.age)

    #条件查询
    #filter():过滤、常用
    # 对应sql:select * from tb_person
    filter_set = PersonModel.objects.filter()   #默认不加条件、获取所有字段的数据 
    #对应sql:select * from tb_person where age > 100
    filter_set = PersonModel.objects.filter(age__gt=100)   #查询age>100的
    filter_set = PersonModel.objects.filter(age__gte=100)  # 查询age>=100的
    filter_set = PersonModel.objects.filter(age__lt=100)  # 查询age<100的
    filter_set = PersonModel.objects.filter(age__lte=100)  # 查询age<=100的
    filter_set = PersonModel.objects.filter(age=100)    # 查询age=100的

    #查询集可以做链式调用
    # print(filter_set.filter().filter().all().first())
    for person in filter_set:
        print('----', person.name, person.age)

    print('-------------------------------------------')
    print(filter_set.first())
    print(filter_set.last())
    print(filter_set.exists())  #查询集是否存在数据、如果存在则为True、否则为False
    print(filter_set.count())   #查询集中的个数
    print('-' * 60)
    
    #values() 和 values_list()
    filter_set = PersonModel.objects.filter()  #查询全部数据
    print(filter_set)
    print(list(filter_set))     #将查询集强制转为列表

    #values() :列表套字典、得到字段和值
    print(filter_set.values())  #将查询集转为列表套字典[{},{}...]、一条数据为一个嵌套字典
    print(filter_set.values('name', 'age'))  # 将查询集转为列表套字典: 拿指定的 key的信息

    #values_list(): 列表套元组、只得到值
    print(filter_set.values_list('name', 'age'))    #查询集转为列表套元组:只得到指定字段的值

    print('-' * 60)
    #filter(): 详细、类似数据库中的where语句
    person = PersonModel.objects.filter(age__in=[100, 200, 110, 56])    #in
    
    #exclude() :排除、取反的意思
    person = PersonModel.objects.exclude(age__in=[100, 200, 110, 56])  # not in  == select * from table_name where age in(100, 200, 110, 56)
    person = PersonModel.objects.filter(age__contains='6')     #包含、模糊查询contains、类似like == select * from table_name where age like '%6%'
    person = PersonModel.objects.filter(age__icontains='6')  # 包含、模糊查询icontains、类似like、忽略大小写
    person = PersonModel.objects.filter(name__regex='^吴')       #正则匹配regex
    person = PersonModel.objects.filter(name__iregex='^吴')      # 正则匹配、忽略大小写
    person = PersonModel.objects.filter(age__range=[200, 400])  #200-400之间的数据、 两边都包含 range == select * from table_name where age between 200 and 400;

    person = PersonModel.objects.filter(name__startswith='wu')  #以wu开头 == select * from where name like 'wu%';
    person = PersonModel.objects.filter(name__istartswith='wu')  # 以wu开头 ,忽略大小写
    person = PersonModel.objects.filter(name__endswith='wu')  # 以wu结尾
    person = PersonModel.objects.filter(name__iendswith='wu')  # 以wu结尾、忽略大小写
    print(person)
    
    
    #聚合函数:Min、Max、sum、avg、count
    #需要导入aggregate聚合函数模块
    result = PersonModel.objects.aggregate(Max('age'))  #最大值    输出:{'age__max': 200}
    result = PersonModel.objects.aggregate(Min('age'))  #最小值    输出:{'age__min': 10}
    result = PersonModel.objects.aggregate(Avg('age'))  #平均值    输出:{'age__avg': 104.33333333333333}
    result = PersonModel.objects.aggregate(Sum('age'))  #求和      输出:{'age__sum': 626}
    result = PersonModel.objects.aggregate(Count('age'))  #统计个数    输出:{'age__count': 6}
    print(result)

    # 排序 -返回QuerySet-[{字典}, ]
    persons = PersonModel.objects.order_by('age')
    persons = PersonModel.objects.values('name').order_by('age')
    persons = PersonModel.objects.all().order_by('age')     #默认做升序排序    输出:<QuerySet [吴11坊 - 10, 吴10坊 - 56, 吴13坊 - 100, 吴15坊 - 110, 吴14坊 - 150, 吴12坊 - 200]>
    persons = PersonModel.objects.all().order_by('age', '-id')   #先按age做升序排序、如果age相同、再按id做降序
    persons = PersonModel.objects.all().order_by('-age')    # 降序
    print(persons.query)    #返回sql语句
    print(persons)


    

    return HttpResponse('查询成功')

posted @ 2024-07-01 22:33  little小新  阅读(38)  评论(0编辑  收藏  举报