Django中不溜教程(4)模型层(1)之定义Model

@TOC

前言

我们在Django快速入门的三个章节简单的体验了一下Django的使用,当然只是使用到了其中的小部分功能,但是我们没有必要再入门demo中平铺没有重点的学习过多的知识点,接下来我们会针对某个模块进行详细系统的学习,当前章节主要讨论模型

思考:
在我们快速入门的demo中有没有涉及到MTV的设计模式。

模型层定义

我们这里说的模型其实就是MTV中的M,模型的功能是描述数据,存储数据的字段与行为,说白了模型就是一个有对应数据库表的类。
模型层是一种抽象概念,包含对各个模型对象的相关操作。在模型层级Django提供给开发者的功能主要有两个:1根据Model对象构建数据表。2自动生成操纵数据API。

模型(Model类)的定义

根据设计的表结构在models.py文件中定义继承于django.db.models.Model的类,类的字段对应数据库表字段,类型也要对应,比如mysql中varcahr字段对应代码中需要使用CharField定义。



from django.db import models


# Create your models here.

# 根据表结构创建模型,定义类继承于models.Model
from django.utils import timezone


class news(models.Model):
    # 每一个属性对应数据库表的一个字段
    # 因为title在数据库表中是以字符形式存在,对应实体类指定为CharField,max_length表示最大长度
    title = models.CharField(max_length=50)
    content = models.CharField(max_length=200)
    # 发表时间,时间类型,指定默认值为当前时间,注意timezone的包
    pub_date = models.DateTimeField("保存日期",default = timezone.now)

    #
    def __str__(self):
        return self.title + "," + self.content + "," + self.pub_date.strftime("%Y-%m-%d")

主键的设定

默认Django会自动在每一个Model类的基础上新增一个自增的数字字段作为主键:

#这是Django自己新增的,不需要我们手动书写一下代码
id = models.AutoField(primary_key=True)

我们可以取消这个功能,自行手动指定主键,只需要为自己的主键字段指定primary_key=True即可,这样Django就不再自动新增主键。

class(models.Model):
        #创建stu_id为主键自动递增的数字主键
        stu_id=models.AutoField(primary_key=True)
        ....

某些时候我们并不想使用自增的数字,而是UUID,Django也为我们提供好了自动生成并插入uuid的功能:

class(models.Model):
        #创建stu_id为主键自动递增的数字主键
        #参数分别为:指定当前属性对应的字段为主键,,,一定要指定默认值
        stu_id=models.UUIDField(primary_key=True, default=uuid.uuid4)
        ....

模型字段

模型中的属性名称

定义字段名时应避免使用关键字,比如数据库中的关键字:desc,select,where等,还有 模型 API 冲突的名称, 如 clean, save, delete 等.

模型中的字段类型

定义数据就是声明字段。要根据实际情况选择字段的类型,字段类型主要还有以下功能:
1Django根据类中指定的字段类型创建表中的字段
2具有基本的数据校验功能
常用字段类型一览:

类型 功能
AutoField 根据可用ID自动递增,本质是IntegerField
BigAutoField 一个64位整数,与AutoField类似,不同之处在于它可存储的范围更广,占用空间大
BigIntegerField 一个64位整数
BinaryField 可存储二进制数据。比如保存转成二进制的文件,不推荐使用
BooleanField 真/假字段
CharField 字符串字段,用于小到大的字符串,有一个必要属性max_length
TextField 超大文本,比如保存小说
DateField 日期
DateTimeField 日期和时间
DecimalField 一个固定精度的十进制数,Decimal在mysql本质是字符串,一般要求精度的小数需要此类型
EmailField 同CharField,会检查该值是使用一个有效的电子邮件地址
FileField 文件上传字段,保存了文件保存的路径等信息
ImageField 同FileField,保存图片保存路径与图片信息,比如宽高
UUIDField 同CharField,用于存储通用唯一标识符的字段
IntegerField 一个整数。-2147483648到2147483647。
FloatField 浮点数
... ...

还有几个与表关系有关的字段类型,我们在表关系中详细介绍。

字段参数

在定义字段的时候除了要考虑类型以外还需要注意参数,比如CharField的max_length参数表示指定字符串最大长度。

class news(models.Model):
        #小括号中就是为字段指定的字段参数
         name =models.CharField(max_length=20)

常用通用参数一览:

参数 功能
null 如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False 。数据库层面。
blank 如果设置为 True,该字段允许为空。默认为 False。涉及表单验证方面
default 指定默认值
primary_key 如果设置为 True ,将该字段设置为该模型的主键。
unique 如果设置为 True,这个字段的值必须在整个表中保持唯一
verbose_name 字段备注名
editable 如果False,该字段将不会显示在管理员或任何其他字段中 ModelForm。在模型验证期间也会跳过它们。默认是True
db_column 用于此字段的数据库列的名称。如果没有给出,Django将使用该字段的名称。
db_index 如果True,将为此字段创建数据库索引。
choices 一系列二元组,用作此字段的选项

我们这里演示以下choices参数的使用:
choice这个属性,用来限制用户做出选择的范围。比如说性别的选择(男或女),需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值(m或f),第二个表示页面上显示的具体内容(男或女)。

#伪代码


class person(models.Model):
        choice = (
            ('m', '男'),
            ('f', '女')
        )
        gender= models.CharField(max_length=1, choices=choice)

#创建一个person实例
p = person('m')
#保存到数据库
p.save()
#对象将具有get_FOO_display()方法获取二元组中相对应的第二个值,其中FOO是字段的名称
#得到的结果是 "男"
p.get_sex_display();

Meta选项

在Model模型类的内部定义 Meta类 来给模型进行一定的配置,常用的比如排序选项,数据库表名自定义等。
举例:

from django.db import models

class men(models.Model):
    age= models.IntegerField()
    height=models.IntegerField()
  #定义内部类Meta选项
    class Meta: 
        #指定默认排序,前缀"-"表示降序,如果去除前缀表示升序,?表示随机排序
        #这里也可以按照多个字段进行排序 ordering = ["-age",“height”]
        ordering = ["-age"]
        #默认表名格式是: 小写的应用名_模型名,我们可以通过db_table 自定义表名
        db_table = "men"

多表操作

我们目前已经可以根据需求创建单表映射的模型类,实际开发中我们会有很多的表,并且表与表之间会有一定关系
多表操作我们也叫做表关系:
1一对一
2多对一,一对多
3多对多
因篇幅原因,我们下一章节对多表操作进行详细介绍。

你可能感兴趣的:(Django中不溜教程(4)模型层(1)之定义Model)