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'))              

 

学习是一种态度,坚持是质变的利器!
posted @ 2018-05-26 16:11  wss96  阅读(1384)  评论(0编辑  收藏  举报