组团学

定义数据库模型

阅读 (295883)

一、属性说明

  • 说明

    • django根据属性的类型确定以下信息

      当前选择的数据库支持字段的类型

      渲染管理表单时使用的默认html控件

      在管理站点最低限度的验证

    • 自增长主键

      django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

    • 属性命名限制

      不能是python的保留关键字

      由于django的查询方式,不允许使用连续的下划线

    • 定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中

    • 逻辑删除

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

  • 字段类型

    字段名称 字段说明 参数
    AutoField 一个根据实际ID自动增长的Integer field 通常不指定(自动创建主键id字段) primary_key=True
    CharField varchar类型字段 max_length存储值的最大长度
    TextField longtext类型 长文本
    IntegerField int 类型字段 存储整形 -2147483648 ~ 2147483647
    SmallIntegerField 小整数 -32768 ~ 32767
    DecimailField 存储浮点形 更加精准(存钱) max_digits=None 位数长度
    decimal_places=None 小数的位数
    FloatField 浮点类型
    BooleanField 存储Bool值 True/False
    NullBolleanField 存储 null/True/False
    DateField date字段 auto_now = False 如果对数据进行修改则会自动保存修改的时间
    auto_now_add=False 会自动添加第一次保存的时间
    俩个参数不能同时设置
    TimeField time字段 参数同上
    DateTimeField datetimefield 参数同上
    FileField 单个上传文件的字段 upload_to = “”
    上传文件的保存路径 storage = None
    存储组件,默认
    ImageField 继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image upload_to = “”
    上传文件的保存路径
    storage = None
    存储组件,默认
  • 字段选项

    通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定

    选项 说明
    null 如果设置为True 则当前字段值可以为null
    blank 如果设置为True 则当前字段可以为空(什么值都没有)值能设置在字符串类型字段
    db_column 设置字段名称 不设置 字段名称默认为属性名(db_column=“test”)
    可选参数 参数说明
    db_index 常规索引(db_index=True)
    unique 唯一索引(unique=True)
    primary_key 主键索引(primary_key=True)
    default 数据库中字段的默认值
    verbose_name Admin中显示的字段名称
    class User(models.Model): # 用户名 最大长度20 username = models.CharField(max_length=20) # 用户密码 最大长度 64 password = models.CharField(max_length=64) # 性别 默认为True sex = models.BooleanField(default=True) # 年龄 默认20岁 age = models.IntegerField(default=20) # 个人简介 最大长度100 默认为info info = models.CharField(max_length=100,default='info') # 头像 最大长度为60 默认为 default.jpg icon = models.CharField(max_length=60,default='default.jpg') # 是否删除 默认不删除 isDelete = models.BooleanField(default=False)
  • 关系

    • ForeignKey 一对多,将字段定义在多的端中
    • ManyToManyField 多对多,将字段定义在两端中
    • OneToOneField 一对一,将字段定义在任意一端中

二、元选项

  • 作用

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

  • 示例

    class Meta: db_table = "user" ordering = ["-age", "name"]
  • 说明

    • db_table

      定义数据表名称,一般使用模型类名小写字母且复数

    • ordering

      ordering = [“age”] 升序

      ordering = ["-age"] 降序

      ordering = ["-age", “name”] 第一个条件相同的数据根据第二个条件排序

      注意:排序会增加数据库的负担

三、objects

  • 概念

    • 是Manager类型的对象,用于与数据库进行交互的
    • 当定义模型时没有指定管理器对象,则Django会为模型类提供一个名为objects的管理器
  • 问题

    如果用户被删除(逻辑删除) ,按照目前的查询会将所有用户获取到,很显然不符合逻辑

  • 自定义管理器对象

    class User(models.Model): #自定义管理器对象, objects = models.Manager() username = models.CharField(max_length=20) password = models.CharField(max_length=64) sex = models.BooleanField(default=True) age = models.IntegerField(default=20) info = models.CharField(max_length=100,default='info') icon = models.CharField(max_length=60,default='default.jpg') isDelete = models.BooleanField(default=False) createTime = models.DateTimeField(auto_now_add=True) class Meta: db_table = "users" ordering = ["-age"]

    注意:如果自定义了管理对象,Django就不会添加objects,但是这两个管理器对象没有任何区别

  • 自定义管理器类

    • 原理

      定义Manager类的子类,实现数据的逻辑删除。重写get_queryset()方法,父类中的该方法用户获取所有的数据

    • 实现

      class MyAppManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(isDelete=False) class User(models.Model): #自定义管理器对象, objects = MyAppManager() username = models.CharField(max_length=20) password = models.CharField(max_length=64) sex = models.BooleanField(default=True) age = models.IntegerField(default=20) info = models.CharField(max_length=100,default='info') icon = models.CharField(max_length=60,default='default.jpg') isDelete = models.BooleanField(default=False) createTime = models.DateTimeField(auto_now_add=True) class Meta: db_table = "users"
      users = User.objects.all()

四、生成数据表

  • 生成迁移文件

    python manage.py makemigrations
  • 执行迁移

    python manage.py migrate

    使用迁移文件在数据库中生成对应的数据表此刻数据库中已经存在我们的用户表

需要 登录 才可以提问哦