[Django系列]6.表结构关系

1.数据库再映射

假设已经定义了models 对象Author,并且也已经迁移到了数据库.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import modelsclass Author(models.Model):
    name=models.CharField(max_length=30)
    age=models.IntegerField()
​
    def __unicode__(self):
        return self.name
如果此时要增加2个字段email,bill_id,只需要在对应的类下面增加2个对象.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import modelsclass Author(models.Model):
    name=models.CharField(max_length=30)
    age=models.IntegerField()
    email=models.EmailField(null=True,blank=True,unique=True) #这里直接使用EmailField类型
    bill_id=models.CharField(max_length=20,null=True,default='13800138000') #更改表结构,通常需要注明长度,是否可为空,如果是可为空,需要指定默认值.
​
    class Meta:
        db_table='books_new_book'  #使用该元类,可以把表名改为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   #该表名是通过db_table='books_new_book自定义
auth_permission             django_admin_log          
auth_user                   django_content_type       
auth_user_groups            django_migrations         
auth_user_user_permissions  django_session    
​
#查看表结构,bill_id,email字段已成功添加到数据库表
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);
​
#可以看到bill_id字段自动设置为默认值'13800138000'
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
相当于Pythondatetime.date
2.14BooleanField
如果没有指定default,默认为None。如果需要能变成null,则应该使用NullBooleanField
2.15NullBooleanField
可以空的Boolean
2.16EmailField
默认max_length=254,validators可以检测格式,form中使用
2.17FileField
这个字段不能设置primary_keyunique选项.在数据库中存储类型是varchar,默认最大长度为100.
2.18FilePathField
2.19URLField
默认max_length=200,有校验机制
2.20UUIDField
一个char(32)的固定类型,使用时需要导入uuid库。
UUIDField(default=uuid.uuid4)

3.字段方法参数

在使用以上这些Field的时候,可以指定一些常用的参数:
3.1null
默认为False,如果指定为True表示该字段可以为空,一般在CharText中不应该使用Null,而应该使用blanknull是纯粹是数据库的语法
read_count=IntegerField(null=True)
3.2blank
默认为False,如果指定为True,则在form表单验证的时候,可以为空。blankdjango给表单验证的时候添加:
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表示该字段可以为空,一般在CharText中不应该使用Null,而应该使用blanknull是纯粹是数据库的语法
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方法将不会调用。这个参数只是DateDateTime以及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)#通过choice字段方法,来引用上面定义好的record_choice

5.关系型的字段

除了一些字段的类型的Field类,django还提供了一些关系型的fields,比如外键、一对多,多对多等,下面将做一个简单的解释:
5.1一对多ForeignKey
ForeignKey:外键。语法是ForeignKey(othermodel,on_delete)
    othermodel表示的是其他模型,注意,如果这个othermodel模型在本模型之后定义的,则必须使用字符串表示。
on_delete表示删除的时候怎么处理,可以取如下值:
    CASCADE:级联删除,如果删除一,相关联的那个多也会删除
    PROTECT:保护类型。如果删除,将会抛出一个ProtectedError错误
    SET_NULL:如果删除了本条数据,外键的那条数据将会设置为null,这个只有在外键nullTrue的情况下才可以使用
    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.nameclass 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的记录增加,否则会报错.
赞(0) 打赏
未经允许不得转载:http://www.yueguangzu.net逗逗网 » [Django系列]6.表结构关系
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏