~~~python
# 进入包含有 manage.py 的文件夹
python manage.py makemigrations
python manage.py migrate
~~~
```
\# class Person(models.Model):
\# # 表的字段信息都可以在代码中取到。
\# # 取到Person表所有的fields: fields = Person.\_meta.fields
\# # 取所有字段的 verbose\_name
\# # verbose\_name\_list = \[field.verbose\_name for field in fields\]
\# # 字段名:field.name,
\# # 字段的值:getattr(Person, field.name)
\# # verbose\_name 是 字段备注信息,help\_text 是 字段补充说明,
\# age = models.IntegerFiedl(null=True, verbose\_name="这是年龄")
\# class Meta:
\# # 表备注
\# verbose\_name = "个人信息表"
\# 通过上面的介绍我们知道 Meta 类的作用就是用于定义 Model 的元数据,即不属于 Model 的字段,但是可以用来标识字段一些属性,下面我们介绍 Meta 定义的常见元数据以及如何在 Model 中使用它们。
\# 1) abstract
\# 一个布尔类型的变量。这个属性是定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的。一般我们用它来归纳一些公共属性字段,然后继承它的子类可以继承这些字段。如果 abstract = True 这个 model 就是一个抽象类。
\# 2) ordering
\# 用于执行获取对象列表时的排序规则。它是一个字符串的列表或元组对象,它的使用格式是由代表字段的字符串和一个表明降序的'-'构成。当字段名前面没有'-'时,将默认使用升序排列。使用'?'将会随机排列。示例如下所示:
\# ordering=\["add\_time"\] #按照升序排序
\# ordering=\["-add\_time"\]#按照降序
\# ordering=\["?add\_time"\]#随机排序
\# #同时指定多个字段来进行排序
\# ordering=\['add\_time','-last\_login\_time'\]#先按升序,在按降序
\# 3) verbose\_name\_plural
\# 这个元数据主要用在管理后台的展示上,verbose\_name\_plural 是模型类的复数名 。如果不设置的话,Django 会使用小写的模型名作为默认值,并且在结尾加上 s。通过此项元数据设置名字可以去掉 s。 可参见《Django Admin数据表可视化》一节。
\# 4) db\_table
\# 这个字段用于指定数据表的名称,通常没有特别需求,将按照 Django 默认的规则生成 Model 对应的数据库表名。
\# #定义该model在数据库中的表名称
\# db\_table = 'Students'
\# #使用自定义的表名,可以通过以下属性
\# table\_name = 'my\_owner\_table'
\# 5) app\_lable
\# 这个选项只在一种使用情形,就是你的模型不在默认的应用程序包下的 models.py 文件中,这时候需要指定你这个模型是哪个应用程序的 app\_label = 'app\_name'。
\# 6) managed
\# 它是一个布尔类型的变量,默认为 Ture,代表 Django 会管理数据的生命周期,即利用 Django 提供的 syncdb 和 reset 命令可以完成创建和删除数据表。如果为 False,则不会对此模型执行数据库表创建或删除操作。比如数据表之间存在 ManyToMany 的关系,在指定为 managed=False 的情况下,Django 不会自动创建中间表,需要我们自己手动创建。
\# 7) indexs
\# 它是一个列表类型的元数据项,用来定义 Model 的索引,列表中的每一个元素都是 Index 类型的实例。
\# Index 引自 django.db.models.indexes.Index
\# 8) default\_permissions
\# Django 默认会给每一个定义的 Model 设置三个权限即添加、更改、删除,它使用格式:default\_permissions=('add','change','delete','view')
\# 9) permissions
\# 除了 Django 默认给 Model 添加的三个权限之外,还可以通过 permisssions 给 Model 添加额外的权限。不过 permissions 是一个包含二元组的元组或者列表,所以使用时应该注意格式,即 permissions=\[(权限代码,权限名称)\],示例如下所示:
\# permissions = \[(have\_read\_permission', '有读的权限')\]
\# 10) unique\_together
\# 这个选项用于下面情形:当你需要通过两个字段保持唯一性时使用。比如用户的姓名(name)和 身份证号码(ID number)两者的组合必须是唯一的,那么需要这样设置:
\# unique\_together = (("first\_name", "last\_name"),)
\# 一个 ManyToManyField 不能包含在 unique\_together 中。如果你需要验证 ManyToManyField 字段的唯一验证,尝试使用 through 属性进行关联。
\# 11) proxy
\# 默认值为为 False, 如果设置成 Ture,则表示为基类、父类的代理模型。这个选项在后续章节还会进行相关介绍,它的主要作用就是创建父模型的代理模型。
\# 12) db\_tablespace
\# 表空间,用于优化数据库性能,常用于 Oracle、PostgerSQL 数据库。MySQL 数据库不支持表空间,所以当数据存储后端数据库不支持的时候,Django 会在自动忽略这个元数据选项。
\# 13) get\_latest\_by
\# 指定一个 DateField 或者 DateTimeField 字段的名字,即 model 的属性名字。使用示例如下:
\# get\_latest\_by = "order\_date"
\# 这个设置让你在使用模型管理器的 lastest() 方法时,默认使用order\_date指定字段来排序。
\# 14) order\_with\_respect\_to
\# 这个选项一般用于多对多的关系中,它指向一个关联对象并将该对象进行排序,使用元数据项后你会得到一个 get\_xxx\_order() 和set\_xxx\_order() 的方法,通过它们你可以设置或者得到排序的对象。
\# AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
\# BooleanField 布尔字段,值为True或False
\# NullBooleanField 支持Null、True、False三种值
\# CharField 字符串,参数max\_length表示最大字符个数
\# TextField 大文本字段,一般超过4000个字符时使用
\# IntegerField 整数
\# DecimalField 十进制浮点数, 参数max\_digits表示总位数, 参数decimal\_places表示小数位数
\# FloatField 浮点数
\# DateField 日期, 参数auto\_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto\_now\_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto\_now\_add和auto\_now是相互排斥的,组合将会发生错误
\# TimeField 时间,参数同DateField
\# DateTimeField 日期时间,参数同DateField
\# FileField 上传文件字段
\# ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片
```
以上是一些注解
代码示例:
```from django.db import models
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_books' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
```