运维开发笔记整理-Django模型语法
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.模型基本概念
1>.什么是模型
模型是你的数据唯一的,权威的信息源。它包含你所存储数据的必要字段和行为。每个模型对应数据库中唯一的一张表。它包含你所存储数据的必要字段和行为。每个模型对应数据库中唯一的一张表。
2>.如何编写模型
模型:每个模型都用一个类表示,该类继承自“django.db.models.Model”。每个模型有多个类的属性变量,而每一个类的属性变量又都代表类数据库表中的一个字段。
字段:每个字段通过Field类的一个实例表示,例如字符字段CharField和日期字段DataTimeField。这种方法告诉Django每个字段保存着什么类型的数据。(偷偷告诉你,Django支持的模型字段比数据库本身的字段要支持的多,比如MySQL的varchar类型,就被Django封装成了不同的模型字段,比如EmailField)。
字段名:每个Field实例的名字(例如username)就是字段的名字,并且是机器刻度的格式。你将在Python代码中使用它的值,并且你的数据库把它为表的列名。
3>.模型字段类型
模型字段类型又很多,比如CharField,BooleanFielld,IntegerField,DateField/DateTimeField,EmailField,TextField,TimeField等等,更多字段类型(Field-types)可参考Django组建的官方地址:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types。
4>.自增主键字段
默认情况下Django会给每个模型添加下面这个字段。
id = models.AutoField(primary_key=True)
如果Django看到你显示设置了Field.primary_key,就不会自动添加id列。
每个模型只能有一个字段指定primary_key=True(无论是显示声明还是自动添加)。
5>.字段的自述名
每个字段类型都接受一个可选的位置参数,字段的自述名,如果没有给定自述名,Django将根据字段的属性名称自动创建自述名,将属性名称的下划线替换成空格。
ForeignKey,ManyToManyField和OneToOneField这三个可以使用verbose_name指定自述名。
#例如:自述名为:"person's first name" first_name = models.CharField("person's first name", max_length=30) #例如:自述名为:"first name" first_name = models.CharField(max_length=30)
6>.字段选项
每个字段有一个也有的参数,例如,CharField(和它的派生类)需要max_length参数来指定VARCHAR数据库字段的大小。
null:
如果为True,Django将用NULL来在数据库中存储空值,默认值是False。
blank:
如果为True,该字段允许不填,默认值是False。null是纯数据库范畴,而blank是数据验证范畴的,blank=True,表单验证允许为空,blank=False,该字段就是必须的。
choices:
由二元组组成的一个可迭代对象(如列表或元组),用来给字段提供选择项,如果设置了choices,默认的表单将是一个选择框,选择框的选择就是choices中的选项。
YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), )
defaulat:
字段的默认值,可以是一个值或者调用对象。
primary_key:
如果为True,那么这个字段就是模型的主键。
unique:
如果改值设置为True,这个字段的值在整张表中必须是唯一的。
更多关于Field字段选项可参考官方链接:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options。
7>.模型meta选项
使用内部的class Meta定义模型的元数据,例如:
from django.db import models class User(models.Model): username = models.IntegerField() class Meta: ordering = ["username"]
模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(tb_table)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。更多文档可参考官方链接:https://docs.djangoproject.com/en/1.11/ref/models/options/。
db_table:
db_table是用于指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性执行。
若不提供该参数,Django会使用app_label + '_' + module_name作为表的名字。
class Meta: db_table = 'server’
Django会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。一个模型数据库表名称,由这个模型的“应用名”和模型名称之间加上下划线组成。
使用Meta类中的db_table参数来重写数据表的名称。
当你通过db_table覆写表名称时,强烈推荐使用小字母给表命名。
order:
这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的
class Meta: ordering = ['-order_date']
它是一个字符串的猎豹或元组。每个字符串是一个字段名,前面带有可选的“-”前缀表示倒叙。前面没有“-”表示正序。使用“?”来表示随机排序。
ordering=['order_date'] # 按订单升序排列 ordering=['-order_date'] # 按订单降序排列,-表示降序 ordering=['?order_date'] # 随机排序,?表示随机 ordering = ['-pub_date', 'author'] # 对 pub_date 降序,然后对 author 升序
app_label:
app_label这个选项只在一种情况下使用,就是你的模型类不在默认的程序包下models.py文件中,这时候你需要指定你这个模型属于哪个应用程序。
class Meta: app_label='myapp'
get_latest_by:
由于Django的管理方法中有个lastest()方法,就是得到最近一行记录。如果你的数据模型中有DataField或DateTimeField类型的字段,你可以通过这个选项来指定lastest()是按照哪个字段进行选取的。
一个DataField或DateTimeField字段的名称,若提供该选项,该模块将拥有一个get_lastest()函数以得到“最新的”对象(依据那个字段):
class Meta: get_latest_by = "order_date"
verbose_name:
verbose_name的意思很艰难,就是给你的模型类起一个更可读的名字,代码如下:
class Meta: verbose_name = "Jason"
managed:
由于Django会自动根据类型生成映射的数据库表,如果你不希望Django这么做,可以把managed的值设置为False。
默认值为True,这个选项为True时Django可以对数据库表进行migrate或migrations,删除等操作。在这个时间Django将管理数据库中表的声明周期。
如果为False的时候,不户籍对数据库表进行创建,删除等操作。可以用于现有表,数据库视图等,其他操作是一样的。
二.编写IDC模型
1>.编写对应的数据库模型
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.db import models class IDC(models.Model): name = models.CharField("机房名称",max_length=32) address = models.CharField("机房地址",max_length=200) phone = models.CharField("机房联系电话",max_length=15) email = models.EmailField("邮件地址",default="") letter = models.CharField("机房地址缩写名称",max_length=5) class Meta: db_table = "idc"
2>.数据库迁移命令
C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py makemigrations Migrations for 'dashboard': dashboard\migrations\0001_initial.py - Create model IDC C:\Users\yinzhengjie\softwares\GitHub\DevOps>