🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] django的模型类定义在应用下的 `models.py` 文件中。 模型类继承自 `django.db.models` 包下的 `Model` 类。 新创建应用 `book` ,我们将在此应用下做演示。 ```python python manage.py startapp book ``` ## 1. 定义 以 ‘图书-角色’为例创建模型类 ```python from django.db import models class Book(models.Model): b_title = models.CharField(max_length=20, verbose_name="标题") b_pub_date = models.DateField(verbose_name="发布日期") b_read = models.IntegerField(default=0, verbose_name="阅读数") b_comment = models.IntegerField(default=0, verbose_name="评论数") is_delete = models.BooleanField(default=False, verbose_name="逻辑删除") class Meta: db_table = "book" verbose_name = "书籍" verbose_name_plural = verbose_name def __str__(self): return self.b_title class Role(models.Model): GENDER_CHOICES = ( (0, 'female'), (1, 'male') ) r_name = models.CharField(max_length=20, verbose_name="角色名称") r_gender = models.SmallIntegerField(choices=GENDER_CHOICES, verbose_name="性别", default=0) r_describe = models.CharField(max_length=200, verbose_name="描述信息", null=True) r_book = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name="书籍") is_delete = models.BooleanField(default=False, verbose_name="逻辑删除") class Meta: db_table = "role" verbose_name = "角色" verbose_name_plural = verbose_name def __str__(self): return self.r_name ``` - `db_table` 指定数据表名字,如果未指明,将会以小写 `应用名+模型类名` 为数据表名字。 - `verbose_name` 指定在 `admin` 站点中显示的名字 - 如果没设置主键,django会自动生成一个自动增长的主键列。如果设置了主键,django不会再自动生成。 - 属性命名限制 - 不能是python的保留关键字。 - 不允许使用连续的下划线,这是由django的查询方式决定的。 - 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下: ``` 字段名 = models.类型名(约束) ``` 定义模型类基本格式如下: ```pytho from django.db import models class 类名(models.Model): 字段名 = models.类型名(约束) class Meta: db_table = "表名" verbose_name = admin中显示名字 verbose_name_plural = admin中显示名字复数 ``` ## 字段类型 django-ORM的基本字段类型 ``` 1、models.AutoField  自增列 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。    2、models.CharField  字符串字段 必须 max_length 参数    3、models.BooleanField  布尔类型 不能为空,Blank=True   4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar   继承CharField,所以必须 max_lenght 参数   5、models.DateField  日期类型 date   对于参数,auto_now = True 则每次更新都会更新这个时间;   auto_now_add 则只是第一次创建添加,之后的更新不再改变。    6、models.DateTimeField  日期类型 datetime   同DateField的参数    7、models.Decimal  十进制小数类型 = decimal   必须指定整数位max_digits和小数位decimal_places    8、models.EmailField  字符串类型(邮箱格式)   对字符串进行正则表达式验证    9、models.FloatField  浮点类型 = double 10、models.IntegerField  整形 11、 整形范围   integer_field_ranges = {     'SmallIntegerField': (-32768, 32767),     'IntegerField': (-2147483648, 2147483647),     'BigIntegerField': (-9223372036854775808, 9223372036854775807),     'PositiveSmallIntegerField': (0, 32767),     'PositiveIntegerField': (0, 2147483647),   }    12、models.IPAddressField  字符串类型(ip4格式) 13、models.GenericIPAddressField  字符串类型(ip4或ip6格式)   参数protocol可以是:both、ipv4、ipv6   验证时,会根据设置报错    14、models.NullBooleanField  允许为空的布尔类型 15、models.PositiveIntegerFiel  正Integer 16、models.PositiveSmallIntegerField  正smallInteger 17、models.SlugField  减号、下划线、字母、数字 18、models.SmallIntegerField  数字   数据库中的字段有:tinyint、smallint、int、bigint    19、models.TextField  字符串=longtext 20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]] 21、models.URLField  字符串,地址正则表达式 22、models.BinaryField  二进制 23、models.ImageField 图片 在数据库中保存的是文件的路径 24、models.FilePathField 文件 ``` ## 约束类型 ``` 1、null=True   数据库中字段是否可以为空    2、blank=True   django的 Admin 中添加数据时是否可允许空值    3、primary_key = False   主键,对AutoField设置主键后,就会代替原来的自增 id 列    4、auto_now 和 auto_now_add   auto_now 自动创建---无论添加或修改,都是当前操作的时间   auto_now_add 自动创建---永远是创建时的时间    5、choices 枚举 GENDER_CHOICES = ( (0, 'male'), (1, 'female') ) r_gender = models.SmallIntegerField(choices=GENDER_CHOICES) 6、max_length 最大长度 7、default  默认值 8、verbose_name  Admin中字段的显示名称 9、name|db_column  数据库中的字段名称 10、unique=True  不允许重复 11、db_index = True  数据库索 引 12、editable=True  在Admin里是否可编辑 13、error_messages=None  错误提示 14、auto_created=False  自动创建 15、help_text  在Admin中提示帮助信息 16、validators=[] 17、upload-to 上传路径 ```