定义数据库模型

2022-09-14 17:27:54 浏览数 (1)

一、属性说明

说明

  • 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

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

0 人点赞