1.数据库再映射
假设已经定义了models 对象Author,并且也已经迁移到了数据库.
from __future__ import unicode_literals
from django.db import models
class Author(models.Model):
name=models.CharField(max_length=30)
age=models.IntegerField()
def __unicode__(self):
return self.name
如果此时要增加2个字段email,bill_id,只需要在对应的类下面增加2个对象.
from __future__ import unicode_literals
from django.db import models
class Author(models.Model):
name=models.CharField(max_length=30)
age=models.IntegerField()
email=models.EmailField(null=True,blank=True,unique=True)
bill_id=models.CharField(max_length=20,null=True,default='13800138000')
class Meta:
db_table='books_new_book'
def __unicode__(self):
return self.name
python manage.py makemigrations
python manage.py migrate
>>python manage.py makemigrations
Migrations for 'book':
book\migrations\0002_auto_20170821_2051.py
- Add field bill_id to author
- Add field email to author
- Rename table for author to books_new_book
>>thon manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, book, contenttypes, sessions
Running migrations:
Applying book.0002_auto_20170821_2051... OK
通过sqlite3 db.sqlite3检查情况
sqlite> .tables
auth_group book_book
auth_group_permissions books_new_book
auth_permission django_admin_log
auth_user django_content_type
auth_user_groups django_migrations
auth_user_user_permissions django_session
sqlite> .schema books_new_book
CREATE TABLE "books_new_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL, "age" integer NOT NULL, "bill_id" varchar(20) NULL, "email" varchar(254) NULL UNIQUE);
sqlite> select * from books_new_book;
3|yangfan|25|13800138000|
4|Fusheng|29|13800138000|
12|FF|26|13800138000|
13|FF|26|13800138000|
28|"zhangsan"|40|13800138000|
29|zhangsan|40|13800138000|
30|zhangsan|40|13800138000|
31|fusheng|29|13800138000|
2.字段类型与方法(Field type & function)
2.1IntegerField
表示的范围是-2147483648-2147483647
2.2SmallIntegerField
表示的范围是-32768-32767
2.3PositiveIntegerField
表示的范围是0-2147483647
2.4PositiveSmallIntegerField
表示的范围是0-32767
2.5BigIntegerField
表示的范围是-9223372036854775808-9223372036854775807
2.6DecimalField
有两个必需的参数:
max_digits=ingt_number:限定数字的最大位数(包含小数位)
decimal_places=int_number:存储数字的小数位
2.7AutoField
根据已有id自增长的整形唯一字段,一般每个model类不需设置该字段,因为django会为每个model自动设置
2.8CharField
需要指定最大宽度 max_length=xxx
2.9TextField
无最大宽度,如果有最大宽度,将在admin页面中的文本输入框中体现。
2.10ImageField
继承了FileField的所有属性和方法。而且还能自动验证上传的对象是否为合法的图像
2.11FloatField
相当于Python中的float
2.12DateTimeField
相当于Python中的datetime
2.13DateField
相当于Python中datetime.date
2.14BooleanField
如果没有指定default,默认为None。如果需要能变成null,则应该使用NullBooleanField
2.15NullBooleanField
可以空的Boolean
2.16EmailField
默认max_length=254,validators可以检测格式,在form中使用
2.17FileField
这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.
2.18FilePathField
2.19URLField
默认max_length=200,有校验机制
2.20UUIDField
一个char(32)的固定类型,使用时需要导入uuid库。
UUIDField(default=uuid.uuid4)
3.字段方法参数
在使用以上这些Field的时候,可以指定一些常用的参数:
3.1null
默认为False,如果指定为True表示该字段可以为空,一般在Char和Text中不应该使用Null,而应该使用blank,null是纯粹是数据库的语法
read_count=IntegerField(null=True)
3.2blank
默认为False,如果指定为True,则在form表单验证的时候,可以为空。blank是django给表单验证的时候添加:
content=TextField(blank=True)
3.3default
提供一个默认值
content=TextField(default=’article’)
3.4editable
是否可以编辑,默认为True,若为False,则不会在admin/界面显示
id=UUIDField(editable=False)
3.5primary_key
指定是否是主键
d=UUIDField(primary_key=True)
3.6null
默认为False,如果指定为True表示该字段可以为空,一般在Char和Text中不应该使用Null,而应该使用blank,null是纯粹是数据库的语法
read_count=IntegerField(null=True)
3.7unique
指定是否唯一
stu_no = CharField(unique=True)
3.8choice
可选的,限制了该选项的字段值必须是所指定的choice中的一个
3.9db_column
数据库column名称。默认为本字段的名称
3.10db_index
如果为True的话,该字段的数据库索引将会被创建
3.11DateField.auto_now
每次修改都会将当前时间更新进去,只有调用Model.save()方法才会调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及Time类才有的
update_time = DateField(auto_now=True)
modify_time
3.12DateField.auto_now_add
第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
Create_time
4.choice的用法
这里定义了一个学习记录的类model,
record_choice是一个元祖,里面枚举了课堂记录的4种状况(已签到,迟到,缺勤,早退)
class StudyRecord(models.Model):
course_record=models.ForeignKey(CourseRecord,verbose_name=u'第几天的课程')
student=models.ForeignKey(StudentInfo,verbose_name=u'学员')
record_choice=(('checked',u'已签到'),
('late',u'迟到'),
('noshow',u'缺勤'),
('leave_early',u'早退'),
)
record=models.CharField(u'上课记录',choices=record_choice,default='checked',max_length=15)
5.关系型的字段
除了一些字段的类型的Field类,django还提供了一些关系型的fields,比如外键、一对多,多对多等,下面将做一个简单的解释:
5.1一对多ForeignKey
ForeignKey:外键。语法是ForeignKey(othermodel,on_delete)
othermodel表示的是其他模型,注意,如果这个othermodel模型在本模型之后定义的,则必须使用字符串表示。
on_delete表示删除的时候怎么处理,可以取如下值:
CASCADE:级联删除,如果删除一,相关联的那个多也会删除
PROTECT:保护类型。如果删除,将会抛出一个ProtectedError错误
SET_NULL:如果删除了本条数据,外键的那条数据将会设置为null,这个只有在外键null为True的情况下才可以使用
SET_DEFAULT:如果删除了本条数据,外键那条数据将会置为默认值,这个只有在外键那个字段设置了default参数才可以使用。
models.py代码示例
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
email = models.EmailField()
def __unicode__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
def __unicode__(self):
return self.title
演示效果
进入python manage.py shell:
>>>p = Publisher(name="清华大学出版社",address="北京")
>>>p.save()
>>> b= Book(title="python web 指南")
>>>b.publisher = p
>>>b.save()
ManyToManyField:语法是ManyToManyField(othermodel)
othermodel表示的是其他模型,如果othermodel这个模型在本模型之后定义的,则必须使用字符串(’othermodel’)
>>>a = Author(name="张三",age=40)
>>>a.save()
>>>b = Book(title="python web 指南")
>>>b.author.add(a)
>>>b.save()
由于存在一对多和多对多关系,所以在新建book记录时,务必需要先添加出版社(Publisher),作者(Author),并保存入库,再进行book的记录增加,否则会报错.
最新评论