阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

定义数据库模型

129次阅读
没有评论

共计 3371 个字符,预计需要花费 9 分钟才能阅读完成。

一、属性说明

  • 说明

    • 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

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计3371字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中