首页 > 其他分享 >12、 Django-模型models的基本操作-增删改查

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

时间:2024-07-01 22:44:20浏览次数:1  
标签:12 return name models age person objects PersonModel 基本操作

一般的数据库操作流程:
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('查询成功')

标签:12,return,name,models,age,person,objects,PersonModel,基本操作
From: https://www.cnblogs.com/littlecc/p/18116156

相关文章

  • 11、 Django-模型基础-models-ORM框架-管理器对象
     #概述django根据属性的类型确定以下信息当前选择的数据库支持字段的类型渲染管理表单时使用的默认htm1控件在管理站点最低限度的验证django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后则django不会再生成默认的主键列#属性命......
  • Leetcode秋招冲刺(专题10--12)
    专题10:动态规划题目509:斐波那契数(NO)解题思路:动态五部曲动态五部曲:这里我们用一个一维数组来保存递归的结果确定dp数组以及下标的含义dp[i]的定义为:第i个数的斐波那契数值是dp[i]确定递推公式这道题已经把递推公式直接给了:状体转移方程dp[i]=dp[i-1]+dp[i-2];dp数......
  • (参数)AFE58JD32LPZAV超声波 AFE、模数转换器ADC09SJ800AAV 800MSPS ADC、ADS52J65IRGC
    1、AFE58JD32LPZAV是一款具有18.5mW/通道功率、数字解调器以及JESD204B和LVDS接口的32通道超声波AFE。AFE58JD32LP是高度集成的模拟前端(AFE)解决方案,专用于需要高性能、低功耗和小尺寸特性的便携式超声波系统。规格位数:10,12通道数:32功率(W):18.5mW电压-供电,模拟......
  • [刷题笔记] Luogu P1612 [yLOI2018] 树上的链
    ProblemDescriptionDescription给定一棵有\(n\)个节点的树。每个节点有一个点权和一个参数。节点\(i\)的权值为\(w_i\),参数为\(c_i\)。\(1\)是这棵树的根。现在,对每个节点\(u\)(\(1\lequ\leqn\)),请在树上你找到最长的一条链\(v_1,v_2,\dotsv_m\),满足如下条件:......
  • 百分浏览器Cent Browser v5.1.1130.129 正式版
    软件简介百分浏览器是基于Chrome内核开发的,因此在界面设计上与Chrome非常相似。它不仅继承了Chrome的稳定性和流畅性,还增加了一些Chrome没有的功能。例如,百分浏览器提供了更好的内存管理方法,可以减少内存占用,这对于经常使用大量标签页的用户来说是一个重要的优势。此外,它还......
  • 征途私服-发布万千好服,玩不停!-www.sf1223.cn
    征途私服有着许多独特的品质,使其与正版游戏区别开来。首先,私服通常会提供大量的游戏元素和功能,比如新增的职业、装备、地图等,让玩家能够体验到更丰富的游戏内容。其次,私服还通常会调整游戏的一些平衡性,使得游戏更加公平。此外,私服的开放性也使得玩家们可以参与到游戏的运营中,例......
  • 征途私服- 发布万千好服,玩不停!-www.sf1223.cn
    征途私服有着许多独特的品质,使其与正版游戏区别开来。首先,私服通常会提供大量的游戏元素和功能,比如新增的职业、装备、地图等,让玩家能够体验到更丰富的游戏内容。其次,私服还通常会调整游戏的一些平衡性,使得游戏更加公平。此外,私服的开放性也使得玩家们可以参与到游戏的运营中,例......
  • 传奇私服:(www.sf1223.cn)新开传奇sf发布网震撼来袭,海量优质好服发布平台-5
    传奇私服发布网(sf1223.cn)是广大游戏爱好者追求游戏乐趣的首选平台。作为一款经典的网络游戏,传奇私服发布网(sf1223.cn)汇聚了无数热衷于游戏的玩家,提供了绚丽多彩的游戏世界和刺激无比的游戏体验。本平台作为传奇SF的发布平台,致力于为广大玩家提供海量优质好服,满足不同游戏需求。......
  • 传奇私服:(www.sf1223.cn)新开传奇sf发布网震撼来袭,海量优质好服发布平台-6
    传奇私服发布网(sf1223.cn)是广大游戏爱好者追求游戏乐趣的首选平台。作为一款经典的网络游戏,传奇私服发布网(sf1223.cn)汇聚了无数热衷于游戏的玩家,提供了绚丽多彩的游戏世界和刺激无比的游戏体验。本平台作为传奇SF的发布平台,致力于为广大玩家提供海量优质好服,满足不同游戏需求。......
  • 农业新质生产力数据(2012-2022年)原始+dofile+测算数据集
    数据简介:农业新质生产力是指在现代农业发展中,通过融合尖端科技、信息技术与创新管理模式,实现农业生产效率飞跃、产品质量显著提升及生产可持续性增强的一种革新性生产能力,农业新质生产力代表了从依赖传统资源转向依靠科技创新与高效资源配置的农业现代化路径,是推动农业绿色转型......