ORM字段操作
django orm 建表字段
在django modle 中,我们定义的类,他的对象就是数据库表中的一行数据!!!
django orm 基础
一:modle的各个字段:
在python中以code first,所以在python中用类和对象,来调用底层数据库API来操作数据库。
1:创建数据库:
数据库配置写在:子应用的:modles.py配置文件中。
需要注意的时候app需要注册。在setting中。
默认情况下,使用的数据库是sqllite3.
创建类:
1 from django.db import models
2
3 # Create your models here.
4 class Userinfo(models.Model):
5 '''
6 功能:该类主要功能是创建用户的信息表格。
7 '''
8 user=models.CharField(max_length=12)
9 password=models.CharField(max_length=40)
10 ipone_num=models.CharField(max_length=12)
11
12
13 class Hostinfo(models.Model):
14 '''
15 功能:该类为用户录入主机数据表格。
16 '''
17 host=models.CharField(max_length=32)
18 address=models.CharField(max_length=32,default="马驹桥机房")
19 ip=models.CharField(max_length=34)
20 stat=models.CharField(max_length=32)
21 prot=models.CharField(max_length=32)
22 service=models.CharField(max_length=32,default='商城业务')
23 department=models.CharField(max_length=32,default="应用运维")
24 mac_info=models.CharField(max_length=32,default="00-av-tv-cctv")
25 pingpai=models.CharField(max_length=32,default="IBM")
26 sn=models.CharField(max_length=32,default="dad13sda")
类中各个字段含义:
1 1、models.AutoField 自增列 = int(11)
2 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
3 2、models.CharField 字符串字段
4 必须 max_length 参数
5 3、models.BooleanField 布尔类型=tinyint(1)
6 不能为空,Blank=True
7 4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
8 input: 12,345,989871234,
9
10 继承CharField,所以必须 max_lenght 参数
11 5、models.DateField 日期类型 date
12 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
13 6、models.DateTimeField 日期类型 datetime
14 同DateField的参数
15 7、models.Decimal 十进制小数类型 = decimal
16 必须指定整数位max_digits和小数位decimal_places
17 8、models.EmailField 字符串类型(正则表达式邮箱) =varchar
18 对字符串进行正则表达式
19 9、models.FloatField 浮点类型 = double
20 10、models.IntegerField 整形
21 11、models.BigIntegerField 长整形
22 integer_field_ranges = {
23 'SmallIntegerField': (-32768, 32767),
24 'IntegerField': (-2147483648, 2147483647),
25 'BigIntegerField': (-9223372036854775808, 9223372036854775807),
26 'PositiveSmallIntegerField': (0, 32767),
27 'PositiveIntegerField': (0, 2147483647),
28 }
29 12、models.IPAddressField 字符串类型(ip4正则表达式)
30 13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
31 参数protocol可以是:both、ipv4、ipv6
32 验证时,会根据设置报错
33 14、models.NullBooleanField 允许为空的布尔类型
34 15、models.PositiveIntegerFiel 正Integer
35 16、models.PositiveSmallIntegerField 正smallInteger
36 17、models.SlugField 减号、下划线、字母、数字
37 18、models.SmallIntegerField 数字
38 数据库中的字段有:tinyint、smallint、int、bigint
39 19、models.TextField 字符串=longtext
40 20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
41 21、models.URLField 字符串,地址正则表达式
42 22、models.BinaryField 二进制
43
44 23、models.ImageField 图片 字符串
45 24、models.FilePathField 文件 字符串
需要注意的是:
1 models.DateField 日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
根绝自己的需要来定义这个字段和使用相应的参数。
1 class Title(models.Model):
2 title=models.CharField(max_length=32)
3 add_date=models.DateField(auto_now=True)#表示该表进行数据的插入的时候时间,当前行的数据插入的时间。
4 update_date=models.DateField(auto_now_add=True)#表示该表的该行数据进行更新的时候,记录时间。
还有字段:models.ImageField 和、models.FilePathField在数据库中保存的是图片和文件的的路径。
默认情况下,如果我们不指定创建 自增列(主键)的话,在数据库中,默认会给我们创建一个名为:id的自增列。
更多参数:
1 1、null=True
2 数据库中字段是否可以为空
3 2、blank=True
4 django的 Admin 中添加数据时是否可允许空值
5 3、primary_key = False
6 主键,对AutoField设置主键后,就会代替原来的自增 id 列
7 4、auto_now 和 auto_now_add
8 auto_now 自动创建---无论添加或修改,都是当前操作的时间
9 auto_now_add 自动创建---永远是创建时的时间
10 5、choices
11 GENDER_CHOICE = (
12 (u'M', u'Male'),
13 (u'F', u'Female'),
14 )
15 gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
16 6、max_length
17 7、default 默认值
18 8、verbose_name Admin中字段的显示名称
19 9、name|db_column 数据库中的字段名称
20 10、unique=True 不允许重复
21 11、db_index = True 数据库索引
22 12、editable=True 在Admin里是否可编辑
23 13、error_messages=None 错误提示
24 14、auto_created=False 自动创建
25 15、help_text 在Admin中提示帮助信息
26 16、validators=[]
27 17、upload-to
28
29 更多参数
可以给我们的列设置默认值。default=''
1 email = models.EmailField() # string,帮助admin做输入验证,modelform
创建完,类,我们进行数据库的创建:执行如下2条命令!
1 python manage.py makemigrations
2 python manage.py migrate
choices:比如说性别:要么是男要么是女。如果有如下表:
1 class Gender(models.Model):
2 name=models.CharField(max_length=32)
3
4 class User_type(models.Model):
5 user_type=models.CharField(max_length=32)
6 nid=models.AutoField(primary_key=True)
7 phone_num=models.IntegerField()
8 phone_num_1=models.IntegerField()
9 gender=models.ForeignKey('Gender')
因为性别是不会改变的。如果按如上的操作,用户类型和性别表建立多对一的情况,那么在我们查询的时候,会给数据库增加压力,这时候我们可以考虑用choices。用元组来表示这个字段,用0、1来表示性别。用内存储存的元组的来
减少表的跨表查询。
1 gender_choices=(
2 (0,'男'),
3 (1,'女'),
4 )
5
6 class User_type(models.Model):
7 user_type=models.CharField(max_length=32)
8 nid=models.AutoField(primary_key=True)
9 phone_num=models.IntegerField()
10 phone_num_1=models.IntegerField()
11 gender=models.IntegerField(choices=gender_choices)#前端页面显示的是男女,而实际上数据库记录的是:0和1,减少数据库的连表操作。
2:django中如果我们想修改,表结构,比如增加一个列,在之前的sqlalchemy中只能借助于第三的模块或者工具,但是在django中,不需要。只需要再执行如下命令既可修改表结构:
1 1 python manage.py makemigrations
2 2 python manage.py migrate
但是在执行如下的命令的时候,需要在对应的类(表)中设置相应的default的值。否则会报错。需要注意的是:报如下错误,前提是该数据库已经插入数据!!!否则不会报错。
解决方法:在相应的类中增加的列的中,填写默认数据:default="值",在运行命令的时候不会报错。
1 class Title(models.Model):
2 title=models.CharField(max_length=32)
3 add_date=models.DateField(auto_now_add=True)#表示该表进行数据的插入的时候时间,当前行的数据插入的时间。
4 update_date=models.DateField(auto_now=True)#表示该表的该行数据进行更新的时候,记录时间。
5 content=models.CharField(max_length=200,default="大话西游,永恒的经典!")
1 Hostinfo.objects.filter(id=val).values(id)
2 Hostinfo.objects.filter(id=val).value_list(id,email)
value:获取结果不是对象的列表的集合。内部小元素是字典,而是列表中嵌套字典。[{'id':2},{'id':1}]
valuelist:是获取元组的集合内嵌套元组,内部小元素是元组。((2,'1@qq.com'),(1,'2@qq.com'))