Django笔记-3-模型-20190526

简介

django为各种数据库提供了很好的支持,django对这些数据库提供了统一的调用API;可以根据不同的也无需求选择不同的数据库;

  1. 配置数据库

    • 在setting.py文件中配置数据库

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'sundb',
              'USER':'root',
              'PASSWORD':'ilovedata',
              'HOST':'localhost',
              'PORT':'3306',
      
          }
      }
      
    • 在工程目录下修改__init.py__文件

      import pymysql
      pymysql.install_as_MySQLdb()
      
  2. 定义模型类

    ** 一个模型类在数据库中对应一张数据表 **

  3. 生成迁移文件

  4. 使用模型类进行增删改查CRUD

ORM

  1. 简介

    ORM: 对象关系映射

    Django↔ORM↔DB

  2. 任务

  • 模型对象的类型生成表结构
  • 将对象/列表的操作转换为sql语句
  • 将sql语句查询到的结果转换为对象/列表
  1. 优点

极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码

定义模型

模型/属性/表/字段之间的关系

一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段;

定义属性

概述
  • Django根据属性的类型定义以下信息
    • 当前选择的数据库支持字段的类型
    • 渲染管理表单时使用的默认HTML控件
    • 在管理站点最低限度的验证
  • Django会为表增加自动增长的主键列, 每个模型只能有一个主键列,如果使用选项设置某属性为主键列后, 则Django不会再生成默认的主键列
  • 属性命名限制
    • 不能使python的保留关键字
    • 由于django的查询方式, 不允许使用连续的下划线
  • 定义属性时,需要字段类型, 字段类型被定义在django.db.models.fields目录下, 为了方便使用, 被导入到django.db.models中;
  • 使用方式
    • 导入from django.db import models
    • 通过models.Field 创建字段类型的对象, 赋值给属性
逻辑删除

对于重要数据都做逻辑删除, 不做物理删除, 实现方法是定义isDelete属性, 类型为BooleanField, 默认值是False.

字段类型
  • AutoField

    • 一个根据实际ID自动增长的IntegerField字段, 通常不指定;如果不指定, Django会自动添加;
  • Charfield(max_lenght=字符长度)

    • 字符串, 默认的表单样式是 TextInput
  • TextField

    大文本字段, 一般超过4000时使用, 默认的表单控件是Textarea

  • IntegerField

    整数

  • DecimalField(max_digits=None, decimal_places=None)

    • 使用Python的Decimal实例表示的十进制浮点数
    • 参数说明
      • DecimalField.max_digits
    • 位数总数
      • DecimalField.decimal_places
        • 小数后的数字位数
  • FloatField

    • 用python的float实例来表示的浮点数
  • BooleanField

    • True/False 字段, 此字段的默认表单控制是CheckboxInput
  • NullBooleanField

    • 支持Null/True/False 三种值
  • DateField(auto_now=False, auto_now_add=False)

    • 使用Python的datetime.date实例表示的日期

    • 参数说明

      • DateField.auto_now

        每次保存对象时, 自动设置该字段为当前时间, 用于“最后一次修改“的时间戳, 他总是使用当前日期, 默认为False;

      • DateField.auto_now_add

        当对象第一次被创建时自动设置当前时间, 用于创建时的时间戳, 他总是使用当前日期, 默认为False;

    • 参数说明

      该字段默认对应的表单控件是一个TextInput, 在管理员站点添加了一个JavaScript写的日历控件, 和一个“Today”的快捷按键, 包含了一个额外的invalid_date错误消息键

    • 注意

      auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

  • TimeField

    使用python的datetime.time实例表示的时间, 参数同DateField

  • DateTimeField

    使用python的datetime.datetime实例表示的日期和时间,参数同DateField

  • FileField

    一个上传文件的字段

  • ImageField

    继承了FileField的所有属性和方法, 但对上传的对象进行校验, 确保他是个有效的image

字段选项
  • 概述

    • 通过字段选项,可以实现对字段的约束
    • 在字段对象创建时, 通过关键字参数制定
  • Null

    如果为True, Django将空值以Null 存储到数据库中, 默认值是False;

  • blank

    如果为True , 则允许该字段为空白, 默认值是False;

注意: Null是数据库范畴的概念, blank则属表单范畴;

  • db_column

    字段的名称, 如果未指定, 则使用属性的名称

  • db_index

    若值为True, 则在表中会为此字段创建索引;

  • default

    默认值

  • primary_key

    若为True, 则该字段会成为模型中的主键字段

  • unique

    如果为True, 则这个字段在表中必须有唯一值

关系
  • 分类

    • ForeignKey: 一对多, 将字段定义在多的一端;
    • ManyToManyField: 多对多, 将字段定义在两端;
    • OneToOneField: 一对一, 将字段定义在任意一端;
  • 用一访问多

    • 格式

      对象.模型类小写_set

    • 示例

      grade.student_set

  • 访问ID

    • 格式

      .对象.属性_id

    • 示例

      .student.grade_id

创建模型类

元选项

在模型类中定义meta类, 用于设置元信息

db_table: 定义数据库表名,推荐使用小写字母; 如不写, 数据表名默认为项目名小写_类名;

ordering: 对象的数据表的默认排序方式, 获取对象的列表时可使用.

例:

class Meta:
	db.table = "students"
	ordering = ['id'] # 升序 若需要降序,["-id"]

注意: 排序会增加数据库的开销

模型成员

类属性

  1. objects

    是manager类型的一个对象,作用是与数据库进行交互;

  2. 当定义模型类没有指定管理器时, Django会为模型创建一个名为objects的管理器;

    class Student(models.Model):
    	# 自定义模型管理器
    	# 当自定义模型管理器后, objects就不存在了
    	stuObj = models.Manager()
    
  3. 自定义管理器manager类

    ​ 模型可以有多个管理器

    作用:

    ​ 向管理器类中添加额外的方法;

    ​ 管理器返回的原始查询集合: 重写get.query()方法;

    示例:

    class StudentManager(models.Manager):
    	def get_queryset(self):
    		return super(StudentManager,self).get_queryset().filter(isDelete=False)
    
    

创建对象

  1. 目的:

    向数据库中添加数据;

  2. 当创建对象时, django不会对数据库进行读写操作, 当调用save()方法时,才与数据库进行交互, 将对象保存到数据库中;

  3. 注意

    init”方法已经在父类Models.Model使用, 在自定义的模型中无法使用;

  4. 方法

    • 在模型类中增加一个类方法

    • 在定义管理器中添加一个方法

转载于:https://my.oschina.net/frank1126/blog/3054114

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值