本文一篇完全介绍django的最重要的model
模型是数据唯一而且准确的信息来源。它包含正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。
这个模型定义了一个 Person, 其拥有 first_name 和 last_name:
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
但是对于大多数的模型都是要机构字段相同的,需要创建base.model(一般的位置再utils文件夹中)
from django.db import models class BaseModel(models.Model): ''' 基类 公共字段 ''' create_time = models.DateTimeField('创建时间',auto_now_add=True) update_time = models.DateTimeField('修改时间',auto_now = True) is_delete = models.BooleanField('逻辑删除',default=False) class Meta: # 抽象类, 用于继承,迁移的时候不创建 abstract = True
对于抽象的模型如用户注册的AbstractUser,迁移时不应该创建
使用内部 Meta类 来给模型赋予元数据
# 这里的basemodel是上面的 class Teacher(BaseModel): name = models.CharField('讲师姓名', max_length=150, help_text='讲师名字') title = models.CharField('职称', max_length=150, help_text='职称') profile = models.TextField('简介', help_text='简介') photo = models.URLField('头像url', default='', help_text='头像url') class Meta: db_table = 'tb_teachers' verbose_name = '讲师' verbose_name_plural = verbose_name def __str__(self): return self.name
下面是Meta常用选项
abstract
这个属性是定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的。如果abstract = True 这个model就是一个抽象类
app_label
这个选型只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。app_label = 'myapp'
db_table
db_table是指定自定义数据库表明的。Django有一套默认的按照一定规则生成数据模型对应的数据库表明。定义该model在数据库中的表名称db_table = 'Students'
get_latest_by
在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序
managed
默认值为True,这意味着Django可以使用syncdb和reset命令来创建或移除对应的数据库。默认值为True,如果你不希望这么做,可以把manage的值设置为False
order_with_respect_to
这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的。指定这个属性后你会得到一个get_xxx_order()和set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象
ordering
这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的'-'构成。当字段名前面没有'-'时,将默认使用升序排列。使用'?'将会随机排列
ordering=['order_date'] # 按订单升序排列 ordering=['-order_date'] # 按订单降序排列,-表示降序 ordering=['?order_date'] # 随机排序,?表示随机 ordering=['-pub_date','author'] # 以pub_date为降序,在以author升序排列
permissions
permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。Django自动为每个设置了admin的对象创建添加,删除和修改的权限。
permissions = (('can_deliver_pizzas','Can deliver pizzas'))
proxy
这是为了实现代理模型使用的,如果proxy = True,表示model是其父的代理 model
unique_together
unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用。比如假设你希望,一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:unique_together = (("first_name", "last_name"),)
注意:一个ManyToManyField不能包含在unique_together中。
如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。
verbose_name
verbose_name的意思很简单,就是给你的模型类起一个更可读的名字一般定义为中文,我们: verbose_name = "学校"
verbose_name_plural
这个选项是指定,模型的复数形式是什么,比如verbose_name_plural = "学校"如果不指定Django会自动在模型名称后加一个’s’
models.CharField
字符串类型。必须接收一个max_length参数.最常用的filed,没有之一!
models.TextField
大量文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!
models.BooleanField
在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField。
models.IntegerField
整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput标签。优先级一般使用这个字段
models.URLField
字符串类型,地址正则表达式,默认最大长度200。
models.BinaryField
二进制数据类型。使用受限,少用。
models.ImageField 图片
models.FilePathField 文件
models.AutoField 自增列=int(11)
通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,或者如果你非要自己设置主键,那么请务必将字段设置为primary_key=True。
注意:Django在一个模型中只允许有一个自增字段,并且该字段必须为主键!
models.DateField 日期字段类型date
注意:参数auto_now=True表示每次更新都会更新这个时间;参数auto_now_add表示只是第一次创建时添加,之后的更新不再改变
models.DateTimeField
日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样
models.TimeField
时间字段,Python中datetime.time的实例。HH:MM[:ss[.uuuuuu]]
models.Decimal
十进制小数类型=decimal,必须指定整数位max_digits和小数位decimal_places
models.EmailField
字符串类型(正则表达式邮箱)=varchar 对字符串进行正则表达式验证,使用DJango内置的EmailValidator进行邮箱地址合法性验证。
models.FloatField
浮点类型=double
models.IntegerField
整形
models.BigIntegerField
长整形
integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), }
models.IPAddressField
字符串类型(ip4正则表达式)
models.GenericIPAddressField
字符串类型(ip4和ip6是可选的)参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置进行报错
models.NullBooleanField
models.ComaSeparatedIntegerField
用逗号分割的数字类型=varchar 继承CharField,所以必须加max_lenght参数
TextField
三个必要参数
名称
max_length
help_text
title = models.CharField('课程名', max_length=150, help_text='课程名') profile = models.TextField('课程简介', null=True, blank=True, help_text='课程简介')
改写字段传入validators参数改写的函数
null=True(默认是false,不能为空)
blank=True 表示代码中创建数据库记录时该字段可传空白(空串,空字符串).
default 默认为
FileField 和ImageField上传文件字段(不能设置为主键)。默认情况下,该字段在HTML中表现为一个ClearableFileInput标签。
class MyModel(models.Model): photo = ImageField(upload_to = 'photos/') #实际的路径就是 MEDIA_ROOT/photos/filename #所以可以用uoload_to来指定文件存放的前缀路径 #FileField也是同样的定义
height_field=None
width_field=None
height_field参数:保存有图片高度信息的模型字段名。width_field参数:保存有图片宽度信息的模型字段名。
DateTimeFieldDateTimeField.auto_now
这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。
DateTimeField.auto_now_add
这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。
class BaseModel(models.Model): ''' 基类 公共字段 ''' create_time = models.DateTimeField('创建时间',auto_now_add=True) update_time = models.DateTimeField('修改时间',auto_now = True) is_delete = models.BooleanField('逻辑删除',default=False) class Meta: # 抽象类, 用于继承,迁移的时候不创建 abstract = True
null
如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False
blank
如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。 null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的
primary_key = False
主键,对AutoField设置主键后,就会代替原来的自增 id 列
bauto_now 和 auto_now_add
auto_now 自动创建---无论添加或修改,都是当前操作的时间 auto_now_add 自动创建---永远是创建时的时间
choices
一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框, 并且限定choices的值是元组中的值
GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
max_length
字段长度
default
默认值
verbose_name
Admin中字段的显示名称,如果不设置该参数时,则与属性名。
db_column
数据库中的字段名称
unique=True
不允许重复
db_index = True
数据库索引
meditable=True
在Admin里是否可编辑
error_messages=None
错误提示
auto_created=False 自动创建
help_text 在Admin中提示帮助信息
validators=[]
验证器
upload-to
文件上传时的保存上传文件的目录
基本原则:
一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可;
一对多的表,可以设中间关联表,也可以将关联表并入“多”这头;若设独立关联表,则可引入“多”这头的主键作为其主键,也可另立主键并将“一”和“多”两表的主键作为关联表的外键;
多对多的表,则必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的外键。
ForeignKey: 一对多 ManyToManyField:多对多 OneToOneField: 一对一
on_delete参数说明:
有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一对一:一个学生只有一个学号 一对多:一个学生有多个课程 多对多:多个学生有多个课程
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) 一个学院信息表有多个学生的信息表
再比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。作者和文章的关系就是一对多。
多对多:在某表中创建一行数据是,有一个可以多选的下拉框 不同的学生有不同课程表
再比如文章和标签的关系。一篇文章可以有多个标签,一个标签可以被多个文章所引用。因此标签和文章的关系是典型的多对多的关系。
一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了) 一个学生信息表就只用一个对应的详细信息表
再比如一个用户表和一个用户信息表。在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的。如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中我们叫做UserExtension。但是用户表User和用户信息表UserExtension就是典型的一对一了。
案例深入
在这里插入图片描述
一个学生只有一个学生的信息详细表,多个学生有多个课程,通过中间关联表就是学生报名表
在这里插入图片描述 在多对多中必须through=‘Enroll' 就是有Enroll表才能有课程表,想下没有学生报名还上什么课,必须设中间关联表就是学生报名表
在这里插入图片描述
如果没有学生,没有课程来报名上学干嘛,所以是多对一,多个学生合成一张报名表
注意:外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 一般使用CASCADE 表示级联删除也就是有一个数据其中一个表删了,管聊的表就会删除,想下如果有个学生不读了,删掉了所有学生报名表中的数据,它绑的外键的学生,课程,是不是先把它删了,这就是级联删除,如果设置了SET_NULL就是把学生的信息删了,它人留下来,下次在补信息就ok了
这个 str 的作用是美化打印出来的结果,使人类更方便查看
class Test: def __init__(self, name, job): self.name = name self.job = job def __str__(self): return 'Name:' + self.name instance = Test('maoli', 'student') print(instance) Name: maoli
补充
# 必需字段 # 没有mobile就不行 REQUIRED_FIELDS = ['mobile']
一直原创,从未转载
请认准我, 将我置标
转发,好看支持一下,感谢