创建模型
模型对应工程中的应用,一个工程可能包含很多的应用,通过命令
python manage.py startapp myapp
创建一个叫myapp的应用,django会帮助生成以下目录:
polls/
__init__.py
admin.py
migrations/
__init__.py
models.py
tests.py
views.py
其中,models.py 中就是实现模型设计的地方。
python通过模型的搭建避免直接操作数据库,而通过配置数据库环境,在不改变模型的情况下对数据库进行切换也没有问题,不仅方便数据库升级或者改变,也方便管理数据模型。
根据djangodocument的指引,编辑models.py创建一个Person的模型:
class Person(models.Model):
first_name = models.CharFeild(max_length=30)
last_name = models.CharFeild(max_length=30)
以上就创建了一个Person模型,对应到数据库,可以看成是创建了一个表单,包含first name和last name两个字段以及django自动创建的主键:id。如果想要指定主键而不是自动创建的id作为主键的话,需要在CharFeild对象初始化时添加属性:primary_key = True 。
Fields
Fields是模型最重要的一部分,是数据的主体。和数据库相对应的,Field也有很多的类型,用得比较多的如上例的CharField创建字符型字段,BigIntegerField可以创建64位最大整形的字段,TextFeild可以创建大字符串字段,BinaryField可以创建字节型字段,BooleanFeild可以创建布尔型字段,还有一些表示功能的EmailField、DateField、TimeField、DateTimeField、IPAddressField等等。
除了指定Field类型外,还需要通过一定的属性来加以约束。如设置blank属性为True则允许字段为空,否则不允许;通过设置default属性可以指定一个默认值,该默认值会在所有的模型实例中都会被引用,所以绝对不能是一个可变对象(字典、列表、集合等),否则所有的实例都引用同一个对象,可想而知改变都是同步的,如果需要用到可变对象的话,应该将其包装成可执行的对象,如下例中,JSON字段将一个字典作为默认值:
def contact_feild_default():
return {'email':'abc@example.com'}
contact_info = models.JSONField("ContactInfo",default=contact_feild_default)
通过指定choices属性,可以将该字段变为可选值,可选值必须是可迭代的:
PROVINCE_CHOICES = (
(‘ZJ’,'Zhejiang'),
(‘FJ','Fujian'),
(‘BJ','Beijing'),
(‘SH','Shanghai'),
)
address = models.CharFeild(max_length = 3 ,choices = PROVINCE_CHOICES,default='ZJ')
其中,元组中的第一个元素表示在数据库中实际使用的内容,第二个元素是便于使用者理解的名字。
可选常量都要写在类定义中,一来可以便于管理命名空间,第二可以方便调用一些常量。在django1.7中,新添加了分组的可选模式
MEDIA_CHOICES = (
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
)
分组模式中可以包含未分组的元组,前两个分组中,Audio、Video表示组别,组别内的元组第一个元素是实际使用的值,第二个元素是便于使用者理解的名字。
django支持的都是关系型数据库,可以在Field中指定关系模型。如ForeignKey指定外键:
class Car(models.Model):
manufacturer = models.ForeignKey('Manufacturer')
# ...
class Manufacturer(models.Model):
# ...
pass
在ForeignKey中使用一个字符串来表示要使用的外键的模型名,django会解析该字符串,并找到响应的模型。如果该模型不在同一个app中,使用 ForeignKey(‘appname.ModelName’)同样可以完成解析。
可以指定外键的属性来加以约束,如related_name,related_query_name,to_field,on_delete,等等,不太明白怎么用,看来以后要恶补一下数据库的知识了。
通过外键可以实现比较复杂的多对多的数据模型