下面的模型定义了一个“人”,它具备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)
每个字段都是一个类属性,每一个类属性表示数据表中的一个列。python
上面的代码,至关于下面的原生SQL语句:git
CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL );
注意:github
myapp_person
由Django自动生成,默认格式为“项目名称+下划线+小写类名”,你能够重写这个规则。id
,固然,你也能够本身指定主键。PostgreSQL
语法。一般,咱们会将模型编写在其所属app下的models.py文件中,没有特别需求时,请坚持这个原则,不要本身给本身添加麻烦。数据库
建立了模型以后,在使用它以前,你须要先在settings文件中的INSTALLED_APPS
处,注册models.py
文件所在的myapp
。看清楚了,是注册app,不是模型,也不是models.py
。若是你之前写过模型,可能已经作过这一步工做,可跳过。django
INSTALLED_APPS = [ #... 'myapp', #... ]
当你每次对模型进行增、删、修改时,请务必执行命令python manage.py migrate
,让操做实际应用到数据库上。这里能够选择在执行migrate以前,先执行python manage.py makemigrations
让修改动做保存到记录文件中,方便github等工具的使用。app
字段是模型中最重要的内容之一,也是惟一必须的部分。字段在Python中表现为一个类属性,体现了数据表中的一个列。请不要使用clean
、save
、delete
等Django内置的模型API名字,防止命名冲突。下面是一个展现,注意字段的写法:工具
from django.db import models class Musician(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician, on_delete=models.CASCADE) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField()
字段命名约束:ui
Django不容许下面两种字段名:spa
与Python关键字冲突。这会致使语法错误。例如:
class Example(models.Model): pass = models.IntegerField() # 'pass'是Python保留字!
字段名中不能有两个以上下划线在一块儿,由于两个下划线是Django的查询语法。例如:
class Example(models.Model): foo__bar = models.IntegerField() # 'foo__bar' 有两个下划线在一块儿!
因为你能够自定义表名、列名,上面的规则可能被绕开,可是请养成良好的习惯,必定不要那么起名。
SQL语言的join、where和select等保留字能够做为字段名,由于Django对它们都进行了转义。
字段类型的做用:
<input type=“text” />
Django内置了许多字段类型,它们都位于django.db.models
中,例如models.CharField
。这些类型基本知足需求,若是还不够,你也能够自定义字段。
下表列出了全部Django内置的字段类型,但不包括关系字段类型(字段名采用驼峰命名法,初学者请必定要注意):
类型 | 说明 |
---|---|
AutoField | 一个自动增长的整数类型字段。一般你不须要本身编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True) ,这是一个自增字段,从1开始计数。若是你非要本身设置主键,那么请务必将字段设置为primary_key=True 。Django在一个模型中只容许有一个自增字段,而且该字段必须为主键! |
BigAutoField | (1.10新增)64位整数类型自增字段,数字范围更大,从1到9223372036854775807 |
BigIntegerField | 64位整数字段(看清楚,非自增),相似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个textinput标签。 |
BinaryField | 二进制数据类型。使用受限,少用。 |
BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。若是要接收null值,请使用NullBooleanField。 |
CharField | 字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是input text。最经常使用的filed,没有之一! |
CommaSeparatedIntegerField | 逗号分隔的整数类型。必须接收一个max_length参数。经常使用于表示较大的金额数目,例如1,000,000元。 |
DateField | class DateField(auto_now=False, auto_now_add=False, **options) 日期类型。一个Python中的datetime.date的实例。在HTML中表现为TextInput标签。在admin后台中,Django会帮你自动添加一个JS的日历表和一个“Today”快捷方式,以及附加的日期合法性验证。两个重要参数:(参数互斥,不能共存) auto_now :每当对象被保存时将字段设为当前日期,经常使用于保存最后修改时间。auto_now_add :每当对象被建立时,设为当前日期,经常使用于保存建立日期(注意,它是不可修改的)。设置上面两个参数就至关于给field添加了editable=False 和blank=True 属性。若是想具备修改属性,请用default参数。例子:pub_time = models.DateField(auto_now_add=True) ,自动添加发布时间。 |
DateTimeField | 日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都同样。 |
DecimalField | 固定精度的十进制小数。至关于Python的Decimal实例,必须提供两个指定的参数!参数max_digits :最大的位数,必须大于或等于小数点位数 。decimal_places :小数点位数,精度。 当localize=False 时,它在HTML表现为NumberInput标签,不然是text类型。例子:储存最大不超过999,带有2位小数位精度的数,定义以下:models.DecimalField(..., max_digits=5, decimal_places=2) 。 |
DurationField | 持续时间类型。存储必定期间的时间长度。相似Python中的timedelta。在不一样的数据库实现中有不一样的表示方法。经常使用于进行时间之间的加减运算。可是当心了,这里有坑,PostgreSQL等数据库之间有兼容性问题! |
EmailField | 邮箱类型,默认max_length最大长度254位。使用这个字段的好处是,可使用DJango内置的EmailValidator进行邮箱地址合法性验证。 |
FileField | class FileField(upload_to=None, max_length=100, **options) 上传文件类型,后面单独介绍。 |
FilePathField | 文件路径类型,后面单独介绍 |
FloatField | 浮点数类型,参考整数类型 |
ImageField | 图像类型,后面单独介绍。 |
IntegerField | 整数类型,最经常使用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput标签。 |
GenericIPAddressField | class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source] ,IPV4或者IPV6地址,字符串形式,例如192.0.2.30 或者2a02:42fe::4 在HTML中表现为TextInput标签。参数protocol 默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。 |
NullBooleanField | 相似布尔字段,只不过额外容许NULL 做为选项之一。 |
PositiveIntegerField | 正整数字段,包含0,最大2147483647。 |
PositiveSmallIntegerField | 较小的正整数字段,从0到32767。 |
SlugField | slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者链接线,一般用于URLs中。能够设置max_length参数,默认为50。 |
SmallIntegerField | 小整数,包含-32768到32767。 |
TextField | 大量文本内容,在HTML中表现为Textarea标签,最经常使用的字段类型之一!若是你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时做用于二者。 |
TimeField | 时间字段,Python中datetime.time的实例。接收同DateField同样的参数,只做用于小时、分和秒。 |
URLField | 一个用于保存URL地址的字符串类型,默认最大长度200。 |
UUIDField | 用于保存通用惟一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品,后面有例子展现。 |