前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >定义数据库模型

定义数据库模型

作者头像
星哥玩云
发布2022-09-14 17:27:54
5340
发布2022-09-14 17:27:54
举报
文章被收录于专栏:开源部署开源部署

一、属性说明

说明

  • 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中显示的字段名称

代码语言:javascript
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span><span class="hljs-params">(models.Model)</span>:</span>
  	<span class="hljs-comment"># 用户名  最大长度20</span>
    username = models.CharField(max_length=<span class="hljs-number">20</span>) 
    <span class="hljs-comment"># 用户密码 最大长度 64</span>
    password = models.CharField(max_length=<span class="hljs-number">64</span>) 
    <span class="hljs-comment"># 性别 默认为True</span>
    sex = models.BooleanField(default=<span class="hljs-keyword">True</span>) 
    <span class="hljs-comment"># 年龄 默认20岁</span>
    age = models.IntegerField(default=<span class="hljs-number">20</span>) 
    <span class="hljs-comment"># 个人简介 最大长度100 默认为info</span>
    info = models.CharField(max_length=<span class="hljs-number">100</span>,default=<span class="hljs-string">'info'</span>) 
    <span class="hljs-comment"># 头像 最大长度为60 默认为 default.jpg</span>
    icon = models.CharField(max_length=<span class="hljs-number">60</span>,default=<span class="hljs-string">'default.jpg'</span>)
    <span class="hljs-comment"># 是否删除 默认不删除</span>
    isDelete = models.BooleanField(default=<span class="hljs-keyword">False</span>) 

关系

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

二、元选项

作用

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

示例

代码语言:javascript
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
    db_table = <span class="hljs-string">"user"</span>
    ordering = [<span class="hljs-string">"-age"</span>, <span class="hljs-string">"name"</span>]

说明

  • db_table 定义数据表名称,一般使用模型类名小写字母且复数
  • ordering ordering = [“age”] 升序 ordering = ["-age"] 降序 ordering = ["-age", “name”] 第一个条件相同的数据根据第二个条件排序 注意:排序会增加数据库的负担

三、objects

概念

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

问题

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

自定义管理器对象

代码语言:javascript
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span><span class="hljs-params">(models.Model)</span>:</span>
    <span class="hljs-comment">#自定义管理器对象,</span>
    objects = models.Manager()
		username = models.CharField(max_length=<span class="hljs-number">20</span>)
    password = models.CharField(max_length=<span class="hljs-number">64</span>)
    sex = models.BooleanField(default=<span class="hljs-keyword">True</span>)
    age = models.IntegerField(default=<span class="hljs-number">20</span>)
    info = models.CharField(max_length=<span class="hljs-number">100</span>,default=<span class="hljs-string">'info'</span>)
    icon = models.CharField(max_length=<span class="hljs-number">60</span>,default=<span class="hljs-string">'default.jpg'</span>)
    isDelete = models.BooleanField(default=<span class="hljs-keyword">False</span>)
    createTime = models.DateTimeField(auto_now_add=<span class="hljs-keyword">True</span>) 
    <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
        db_table = <span class="hljs-string">"users"</span>
        ordering = [<span class="hljs-string">"-age"</span>]

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

自定义管理器类

原理

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

实现

代码语言:javascript
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyAppManager</span><span class="hljs-params">(models.Manager)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_queryset</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-keyword">return</span> super().get_queryset().filter(isDelete=<span class="hljs-keyword">False</span>)
      
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span><span class="hljs-params">(models.Model)</span>:</span>
    <span class="hljs-comment">#自定义管理器对象,</span>
    objects = MyAppManager()
		username = models.CharField(max_length=<span class="hljs-number">20</span>)
    password = models.CharField(max_length=<span class="hljs-number">64</span>)
    sex = models.BooleanField(default=<span class="hljs-keyword">True</span>)
    age = models.IntegerField(default=<span class="hljs-number">20</span>)
    info = models.CharField(max_length=<span class="hljs-number">100</span>,default=<span class="hljs-string">'info'</span>)
    icon = models.CharField(max_length=<span class="hljs-number">60</span>,default=<span class="hljs-string">'default.jpg'</span>)
    isDelete = models.BooleanField(default=<span class="hljs-keyword">False</span>)
    createTime = models.DateTimeField(auto_now_add=<span class="hljs-keyword">True</span>) 
    <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
        db_table = <span class="hljs-string">"users"</span>
代码语言:javascript
复制
users = User.objects.all()

四、生成数据表

生成迁移文件

代码语言:javascript
复制
python manage.py makemigrations

执行迁移

python manage.py migrate

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、属性说明
  • 二、元选项
  • 三、objects
  • 四、生成数据表
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档