Django模型基础

接上一节

新增了一个模型字段

并执行迁移后

python3 manage.py makemigrations
python3 manage.py migrate 

这样我们就可以看到后台页面就会多出一个'用户类型'的下拉选项

因为这边的用户类型2是添加了editable=False 所以默认是不显示的 但在数据库中我们是可以看到这个字段的

modles的基本操作

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


        Django通过Model操作数据库,不管你数据库的类型是MySq1或者Sqlite,Django自动帮你生成相应数据库类型的Django帮我们自动完成。只要会写Model就可以了。SQL语句,所以不需要关注SQL语句和类型,对数据的操作apping,简称ORM)框架去操控数据库。

        django使用对象关系映射(0bject Relational M:是一种程序技术,用于实现面向对象编程语言里不同类型系

        ORM(0bject Relational Mapping)对象关系映射统的数据之间的转换。

增删改查

#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='li', last_name='si')

        4)使用get_or_create方法,可以防止重复
                Author.objects.get_or_create(first name='zhang', last name='san')

新增一个模型类 创建一个表

# 注意 需要数据迁移

# 如果models.py文件有变动,需要重新迁移

# 生成迁移文件:python manage.py makemigrations

# 执行迁移文件:python manage.py migrate

# ORM 对象关系映射

# 模型类 => 表结构

# 类属性 => 表字段

# 一个对象 => 表的一行记录

在views.py 增加视图函数

# 增加函数
def add_person(request):
    # 方式1
    p = PersonModel()
    p.name = "zhangsan"
    p.age = 20
    p.save()  # 同步数据到数据库

    return HttpResponse("增加成功")

增加一个urls

path("add/", add_person),  # 添加数据

访问http://127.0.0.1:8000/add/

我们可以看到数据库中成功增加了一条数据

在创建的时候我们设置了unique=True 再次执行同一个名字增加到数据库的时候会报错

可以增加一个try

 # 方式2
    try:
        p = PersonModel(name="王五", age=33)
        p.save()  # 同步数据到数据库
    except Exception as e:
        return HttpResponse(f"增加失败:{e}")

    return HttpResponse("增加成功")

 

# 方式3
    try:
        PersonModel.objects.create(name="刘德华", age=60)
    except Exception as e:
        return HttpResponse(f"增加失败:名字已存在")

    return HttpResponse("增加成功")

 

# 方式4
    try:
        ret = PersonModel.objects.get_or_create(name="张学友", age=60)
        print("ret:", ret)
    except Exception as e:
        return HttpResponse(f"增加失败:名字已存在")

    return HttpResponse("增加成功")

ret: (<PersonModel: PersonModel object (5)>, True)
[07/May/2024 11:03:27] "GET /add/ HTTP/1.1" 200 12

第一次创建就是True 如果已经存在会显示Flase 

# 添加多条数据
    for i in range(10, 21):
        PersonModel.objects.create(name=f"张{i}峰", age=i)
    return HttpResponse("增加成功")

 

删除数据

删除第一条数据

# 删除数据
def del_person(request):
    # 删除数据
    # 1.先找到要删除的数据
    # 2.然后删除
    try:
        p = PersonModel.objects.first()  # 第一条数据
        p.delete()  # 删除数据
    except Exception as e:
        return HttpResponse(f"删除失败:{e}")
    return HttpResponse("删除成功")

 删除多条数据

PersonModel.objects.filter(age__gt=50).delete()  # 删除age大于50的数据

修改数据

# 修改数据
def update_person(request):
    # 先找到修改的数据
    # 然后修改数据
    try:
        p = PersonModel.objects.first()  # 第一条数据
        p.age = 666
        p.save()  # 同步数据到数据库
    except Exception as e:
        return HttpResponse(f"修改失败:{e}")
    return HttpResponse("修改成功")

修改多条数据 举例把所有数据的age 修改为100

PersonModel.objects.all().update(age=100)

 也可以指定修改某一条数据

p = PersonModel.objects.first()  # 第一条数据
        p.age = 666
        p.save(update_fields=["age"])

 查询数据

        get():获取单条数据:
                Author.objects.get(id=123)
                如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常
                如果找到多个,会引发模型类.Multiple0bjectsReturned 异常

        first():返回查询集(QuerySet)中的第一个对象

        last():返回查询集中的最后一个对象
        count():返回当前查询集中的对象个数
        exists():判断查询集中是否有数据,如果有数据返回True没有反之

        all():获取全部数据:
                Author.objects.all()

        values():获取指定列的值,可以传多个参数!返回包含字典的列表(保存了字段名和对应的值)

                Author.objects.all().values('password')

        values_list():获取指定列的值,可以传多个参数!返回包含元组列表(只保存值)

                Author.objects.all().values_list('password')

进阶操作:
        #获取个数
        Author.obfects.filter(name='seven').count()
        Author.objects.filter(id__gt=1)       #获取id大于1的值

        # select * from Author where id>1
        Author.objects.filter(id__gte=1)     #获取id大于或等于1的值

        # select * from Author where id >=1
        Author.objects.filter(id__lt=10)      # 获取id小于10的值

        # select * from Author where id< 10
        Author.objects.filter(id__lte=10)#获取id小于或等于10的值

        # select * from Author where id <= 10
        Author.objects.filter(id__lt=10,id__gt=1) #获取id大于1 且 小于18的值

        # select * from Author where id < 10 and id>1
        Author.objects.filter(id__in=[11,22,33])  #获取id在11、22、33中的数据

        # select * from Author where id in(11,22,33)

        Author.objects.exclude(id__in=[11,22,33]) # not in

        # select * from Author where id not in(11,22,33)
        Author.objects,filter(name__contains="ven") # contains(和数据库中like语法相同)

        # select * from Author where name like '%ven%"
        Author.objects.filter(name icontains="ven")# icontains大小写不敏感

        Author.objects.filter(nameAuthor.objects.filter(name_regex="^ven")# 正则匹配
        Author.objects.filter(nameAuthor.objects.filter(name_iregex="^ven")# 正则匹配忽略大小写              Author.objects.filter(age__range=[10,20])#范围bettwen and
        # startswith,istartswith,endswith,iendswith:

        #以什么开始,以什么结束,和上面一样带i的是大小写不敏感的,其实不带i的也忽略大小写
        Author.objects.filter(name='seven').order_by('id')# asc升序                                                             Author.objects.filter(name='seven').order_by('-id')# desc降序
        Author.objects.all()[10:20 # 切片,取所有数据的10条到20条,分页的时候用的到

        #手动分页

        page 页码
        per_page 每页数量 =5

        第1页(page=1):0-4 =>[0:5]

        第2页(page=2):5-9 =>[5:10]

        ]第3页(page=3):10-14 =>[10:15]

        第4页(page=4):15-19 =>[15:20]
        每一页数据范围
        [(page-1)*per_page: page*per_page]
        # 聚合
        使用aggregate()函数返回聚合函数的值
        Avg:平均值
        Count:数量
        Max:最大
        Min:最小
        Sum:求和
        

from django.db.models import Count,Min,Max,Sum

        Author.objects.aggregate(Max('age'))

查询数据的内容比较多下一节再进行详细演示

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值