Django模型models(2)

  1. 配置数据库
	settings.py
	DATABASES = {
		'default':{
			'ENGINE':'数据库引擎',
			'NAME':'数据库名',
			'USER':'用户名',
			'PASSWORD':'密码',
			'HOST':'主机',
			'PORT':'端口',
		}
	}

指令:
	1.python3 manage.py makemigrations
		将Models类生成中间文件
	2.python3 manage.py migrate
		将中间文件映射回数据库
  1. Models 语法
    1. 语法
		class CLASSNAME(models.Model):
			NAME=models.FIELD_TYPE(FIELDOPTIONS)

		1.CLASSNAME:实体类名,表名的组成规范
		2.NAME:属性名,列名
		3.FIELD_TYPE : 字段类型
			1.BooleanField()
			2.CharField(max_length=xxx)
			3.DateField()
			4.DateTimeField()
			5.DecimalField(max_digits=x,decimal_places=x)
			6.FloatField()
			7.EmailField()
			8.IntegerField()
			9.ImageField()
			10.TextField()
		4.FIELDOPTIONS
			1.primary_key : True 表示主键
			2.null : True 表示允许为空
			3.default : 指定默认值
			4.db_index : True 表示添加索引
			5.db_column : 指定列名
			6.unique : True 表示唯一
	2.指令
		python3 manage.py inspectdb > 文件名.py
  1. CRUD
    1. 增加数据
      1. Entry.objects.create(xx=xx,xx=xx)
        返回值:返回创建好的实体对象
      2. 创建Entry对象,并调用save()
        obj = Entry(xx=xx)
        obj.xx = xx
        obj.save()
      3. 通过字典构建对象
        obj = Entry(**dic)
        obj.save()
    2. 查询数据
      通过 Entry.objects 属性调用查询接口
      1. Entry.objects.all()
        QuerySet : 将实体对象封装到列表中
      2. Entry.objects.values(‘列1’,‘列2’)
        作用:查询返回部分列的值
        返回:QuerySet , 将查询数据封装到字典中再封装到列表中
      3. Entry.objects.values_list(‘列1’,‘列2’)
        返回:QuerySet , 将查询数据封装到元组总再封装到列表中
      4. Entry.objects.order_by(“列1”,"-列2")
        Entry.objects.all().order_by().value_list()
        ===================================================

模型

  1. CRUD
    1. 增加数据(略)

    2. 查询

      1. 根据条件查询部分数据
        方法:filter(条件)
        语法:Entry.objects.filter(条件)
        返回值:QuerySet
        • 示例:
          1. 查询Author实体中id为1的信息
            authors=Author.objects.filter(id=1)
          2. 查询Author实体中id为1并且isActive为True的
            authors=Author.objects.filter(id=1,isActive=True)
        • 非等值条件的构建,需要使用查询谓词(Field Lookup)
          • 查询谓词:每一个查询谓词是一个独立的查询功能
            语法: xxx.filter(属性__查询谓词=值)
            1. __exact : 等值匹配
              Author.objects.filter(id__exact=1)
              select * from author where id = 1

            2. __contains : 包含指定值
              Author.objects.filter(name__contains=‘w’)
              select * from author where name like ‘%w%’

            3. __gt : 大于指定值
              Author.objects.filer(age__gt=50)
              select * from author where age > 50

            4. __gte :

            5. __lt :

            6. __lte :

            7. __in:查找数据是否在指定范围内
              Publisher.objects.filter(country__in=[‘中国’,‘日本’,‘韩国’])

              select * from publisher where country in (‘中国’,‘日本’,‘韩国’)

            8. __range:查找数据是否在指定的区间范围内
              Author.objects.filter(age__range=(35,50))

            • 练习:
              1. 查询Author表中age大于等于85的信息
                Author.objects.filter(age__gte=85)
              2. 查询Author表中姓巴的人的信息
                Author.objects.filter(name__startswith=‘巴’)
              3. 查询Author表中Email中包含in的人的信息
                Author.objects.filter(email__contains=‘in’)
              4. 查询Author表中Age大于"巴金"的age的信息
      2. 不等的条件筛选
        语法:exclude(条件)
        用法:Entry.objects.exclude(条件)
      3. 查询只返回一条数据
        语法:get(条件)
        语法:Entry.objects.get()
        注意:
        该方法只能返回一条数据
        查询结果多余一条数据的话,则抛异常
        查询结果如果没有数据的话,则抛异常
      4. 聚合查询
        1. 不带分组
          语法:aggregate()
          用法:Entry.objects.aggregate(名=聚合函数(‘列’))
          聚合函数:
          from django.db.models import Sum,Avg,Count,Max,Min
        2. 带分组
          语法:annotate()
          用法:
          Entry.objects
          .values(‘分组列名’,‘分组列名’)
          .annotate(名=聚合函数(‘列’))
          .values(‘查询列名’)
    3. 修改

      1. 修改单个实体

        1. 通过 get() 得到要修改的实体对象

        2. 通过 对象.属性 的方式修改数据
        3. 保存
          通过 对象.save() 保存数据
      2. 修改QuerySet
        直接调用QuerySet的update(属性=值) 实现批量修改
    4. 删除
      删除单个对象/查询结果集 都是调用 delete()
      1.删除单个对象
      Author.objects.get(id=1).delete()

      1. 删除查询结果集
        Author.objects.filter(isActive=False).delete()
  2. F查询 和 Q查询
    1. F查询 - F()
      1. 作用
        在执行过程中获取某列的值
      2. 语法:
        from django.db.models import F
        F(‘列名’)
      3. 示例
        更新Author实体中所有的数据的age+10
        Author.objects.all().update(age=F(‘age’)+10)
    2. Q查询 - Q()
      1.作用
      在条件中用来实现 or 的操作
      1. 语法
        from django.db.models import Q
        Q(条件1)|Q(条件2)
      2. 示例
        查询Author表中id=1或age>=80的人的信息
        Author.objects.filter(Q(id=1)|Q(age__gte=80))
  3. 原生的数据库操作方法
    1. 查询
      1. 语法
        raw(sql语句)
      2. 用法
        Entry.objects.raw(‘sql语句’)
      3. 返回值
        QuerySet
    2. 增删改
	from django.db import connection

		def doSQL():
			#更新index_author表中所有的数据的isActive=1
			with connection.cursor() as cursor:
				cursor.execute('update index_author set isActive=1')
			return HttpResponse('xxx')
  1. 使用后台管理models
    1. 后台的配置
      登录地址:http://localhost:8000/admin
      使用指令创建后台管理员:
      python3 manage.py createsuperuser
    2. 基本的数据管理
      1. 在应用中的admin.py中注册要管理的实体类

        1. admin.py
          作用:注册要管理的models类
        2. 注册Models
          from django.contrib import admin
          from .models import *
          admin.site.register(Entry)
          admin.site.register(Entry)
      2. 定义Models的展现形式

        1. 通过实体类的 str() 定义展现名称

        classd Author(models.Model):
        xxx xxx
        def str(self):
        return self.name

        1. 通过 verbose_name 字段选项,修改名称
          name = models.CharField(
          max_length = 30,
          verbose_name=‘姓名’
          )
        2. 通过Meta内部类 修改展现形式

        class Author(models.Model):
        xxx xxx
        class Meta:
        1.db_table
        指定当前类映射到的表名
        (设置完成后立马同步数据库)
        2.verbose_name
        定义实体类在后台的名称(单数)
        3.verbose_name_plural
        效果同上(复数)

        • 练习:
          1. 修改 Publisher 的后台显示
            1. 更改表名为 publisher
            2. 修改后台展示名称为 - 出版社
            3. 修改每个属性对应的中文名
          2. 修改 Book 后台显示
            1. 更改表名为 book
            2. 修改后台展示名称 - 书籍
            3. 修改每个属性对应的中文名
  2. 高级的数据管理
    1. admin.py 中创建高级管理类并注册

      1. 声明高级管理类
        class EntryAdmin(admin.ModelAdmin):
        pass
      2. 注册高级管理类
        admin.site.register(Entry,EntryAdmin)
    2. 练习
      为 Publisher 增加高级管理功能
      1.在列表页中显示 name,address,city 属性
      2.在列表页中 address 和 city 是可编辑的
      3.右侧增加过滤器 , 允许按照city筛选
      4.顶部增加搜索框,允许按照name和website搜索
      5.详情页中分组显示:
      1.name,address,city 基本信息
      2.country,website 高级信息,可折叠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值