Python【day 16】:Python学习(web框架:django学习 models数据库操作)
models表基本结构
class userinfo(models.Model): user_type_list =( (1,"男"), #这里逗号不能少 拼写 (2,"女"), #这里在数据库存储的是1或者2 ) user_type = models.IntegerField(choices=user_type_list,default=1) #admin.py中用户类型:下拉框(select) 页面显示汉字男女 数据库显示1,2(数字) name = models.CharField(max_length=32,verbose_name="姓名",unique=True) #verbose_name Admin中字段的显示名称 # unique=True 不允许重复 cdate = models.DateTimeField(auto_now_add=True) #1创建时间 udate = models.DateTimeField(auto_now=True) #2修改时间 # 对于参数,auto_now = True 则每次更新都会更新这个时间;默认是fasle # auto_now_add 则只是第一次创建添加,之后的更新不再改变。 默认是fasle decimal1 = models.DecimalField(max_digits=3,decimal_places=2) #3小数 # 必须指定所有数字位max_digits 3 和小数位decimal_places 2 注意整数位是 max_digits-decimal_places=1 email =models.EmailField(null=True,blank=True) #null=True表示数据库允许为空 blank=True表示admin后台管理页面允许为空 # 邮箱格式或者IP在admin后台正则判断(如果不使用admin后台,2个都可以用CharField代替) email2 =models.EmailField(default="alex@163.com") #设置不输入的默认值 参数 ip1 = models.GenericIPAddressField(null=True,blank=True) #ip img = models.ImageField(null=True,blank=True,upload_to="upload") #4文件图片上传 适用admin后台管理页面 #对字符串进行正则表达式 #1字符串 2数字 3浮点 4布尔 5日期时间 大致5类(如果不涉及admin.py的话,基本5种类型) def __unicode__(self): #py2.7 return self.name def __str__(self): #py3.5 return self.name #添加字段,改变表结构了,需要migration #添加参数属性,改变字段的属性,就不需要migration
表字段说明
#1字符串 2数字 3浮点 4布尔 5日期时间 大致5类(如果不涉及admin.py的话,基本5种类型)
1、models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 2、models.CharField 字符串字段 必须 max_length 参数 3、models.BooleanField 布尔类型=tinyint(1) 不能为空,Blank=True 4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar 继承CharField,所以必须 max_lenght 参数 5、models.DateField 日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。 6、models.DateTimeField 日期类型 datetime 同DateField的参数 7、models.Decimal 十进制小数类型 = decimal 必须指定整数位max_digits和小数位decimal_places 8、models.EmailField 字符串类型(正则表达式邮箱) =varchar 对字符串进行正则表达式 9、models.FloatField 浮点类型 = double 10、models.IntegerField 整形 11、models.BigIntegerField 长整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 12、models.IPAddressField 字符串类型(ip4正则表达式) 13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的) 参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置报错 14、models.NullBooleanField 允许为空的布尔类型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 减号、下划线、字母、数字 18、models.SmallIntegerField 数字 数据库中的字段有:tinyint、smallint、int、bigint 19、models.TextField 字符串=longtext 20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正则表达式 22、models.BinaryField 二进制 23、models.ImageField 图片 24、models.FilePathField 文件
3字段参数说明
记住常用的几个就可以
1、null=True 数据库中字段是否可以为空 2、blank=True django的 Admin 中添加数据时是否可允许空值 3、primary_key = False 主键,对AutoField设置主键后,就会代替原来的自增 id 列 4、auto_now 和 auto_now_add auto_now 自动创建---无论添加或修改,都是当前操作的时间 auto_now_add 自动创建---永远是创建时的时间 5、choices GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 6、max_length 7、default 默认值 8、verbose_name Admin中字段的显示名称 9、name|db_column 数据库中的字段名称 10、unique=True 不允许重复 11、db_index = True 数据库索引 12、editable=True 在Admin里是否可编辑 13、error_messages=None 错误提示 14、auto_created=False 自动创建 15、help_text 在Admin中提示帮助信息 16、validators=[] 17、upload-to
4连表结构
一对多
#添加字段,改变表结构了,需要migration #添加参数属性,改变字段的属性,就不需要migration # 1一对多(2个表)--ForeignKey 应用场景:钱有4个颜色 人有4个不同身份(普通用户、会员、白金会员) # 组(业务线、部门、群组)和主机的关系(一个组对应多个主机,但是一个主机只可以属于一个组)-此时是一对多 class color(models.Model): name = models.CharField(max_length=32) #比如4个颜色 红黄蓝绿 对应的id 分别是1234 class something(models.Model): c1 = models.CharField(max_length=32) c2 = models.CharField(max_length=32) c3 = models.CharField(max_length=32) color1 = models.ForeignKey(color) #color1_id 外键,这个字段对应的是color表的主键id # 外键(表2的普通字段c1,正好是表1的主键,表2的普通字段c1就是外键) #表2的外键 关联的是表1 的id(id是自动生成的) # color1 = models.ForeignKey("color") #表名加引号和不加引号是一样的 #color1是表2字段名字 color是表1名 这里存的是id 比汉字省空间 # # 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) foreikey允许重复 # 例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。 # 一个普通用户包含多个人(一对多)--但是一个人不会是多个身份(不是多对多
4-2多对多
#2多对多(中间表-对应关系 user group user_group表(一个字段自动产生表)) # 组(业务线、部门、群组)和主机的关系(一个组对应多个主机,一个主机也可以属于多个组) # 组(业务线、部门、群组)和人的关系(一个组对应多个人,如果一个人也可以属于多个组) #双向一对多 # 多对多:在某表中创建一行数据是,有一个可以多选的下拉框 # 例如:创建用户信息,需要为用户指定多个爱好 # 一个用户可以有多个爱好(一对多),同时,每个爱好都包含多个用户(一对多),双向一对多就是多对多 class user(models.Model): name = models.CharField(max_length=32) email = models.CharField(max_length=32) mobile = models.CharField(max_length=32) # user_group = models.ManyToManyField(group) #表名加引号和不加引号都行 user_group = models.ManyToManyField("group") #这一行自动产生第三张用户id_组id的关系对应表(中间表) 多对多 class group(models.Model): group_name = models.CharField(max_length=32)
4-3 一对一
#3 一对一 在一对一的基础上foreignkey基础上加了一个不能重复 unique foreikey不允许重复 # 一对一:models.OneToOneField(其他表) # 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了 # 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据 # 表1有5个用户,这5个用户,只允许其中前2个用户id=1,2有管理员的密码,其余8人没有管理员密码 # 表2存放管理员用户名 密码 第三个字段就是表的用户id1,2 class user1_1(models.Model): name = models.CharField(max_length=32) email = models.CharField(max_length=32) mobile = models.CharField(max_length=32) class admin1(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) user_id = models.OneToOneField("user1_1") #这个字段的属性必须是uniq才行,否则报错
连表结构
- 一对多:models.ForeignKey(其他表)
- 多对多:models.ManyToManyField(其他表)
- 一对一:models.OneToOneField(其他表)
应用场景:
- 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。- 多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好- 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
5、表的增删改查基本操作
models
#4基本增删改查--单表(没有关联,没有一对多,没有多对多) class simplemodel(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) def __unicode__(self): #py2.7 return self.username def __str__(self): #py3.5 return self.username views #基本增删改查 def models2(request): # 增 # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj = models.Tb1(c1='xx', c2='oo') # obj.save() #1增 方式1 # models.simplemodel.objects.create(username="alex",password="123") # # 方式2 # obj = models.simplemodel(username="alex1",password="123") # obj.save() # # 方式3 # dic ={"username":"alex2","password":"123"} #可以把字典传入 form的返回是字典,可以直接传到数据库 # models.simplemodel.objects.create(**dic) #记住是2个星号 #2删除 # models.simplemodel.objects.filter(username="alex2").delete() #1删除指定行 # ## models.simplemodel.objects.all().delete() #2删除所有行 清空表 # dic ={"username":"alex2","password":"123"} #3可以将多个条件写在字典中 删除指定行 # models.simplemodel.objects.filter(**dic).delete() #2个星号必须有 #3修改 方式1 # models.simplemodel.objects.filter(username="alex2").update(password="124") #修改指定行 均支持 **kwargs # 方式2 # dic ={"username":"alex2","password":"123"} #可以把字典传入 form的返回是字典,可以直接传到数据库 # models.simplemodel.objects.filter(username="alex2").update(**dic) #支持 **kwargs filter和update后面都可以加**dic #方式3--不推荐 # obj=models.simplemodel.objects.get(id=4) ## 按照id,修改单条数据,如果id不存在,就报错,出现大黄页 报错如下 # #simplemodel matching query does not exist. # obj.username="jack" # obj.save() #4 查询 # obj_all=models.simplemodel.objects.all() #1查询所有 # print(obj_all) # # obj_where=models.simplemodel.objects.filter(username="alex2") #2查询指定条件的 # print(obj_where) # # dic ={"username":"alex2","password":"123"} #可以将多个条件写在字典中 # obj_dic=models.simplemodel.objects.filter(**dic) #3查询指定条件的,可以传入字典 # print(obj_dic) # obj_get_id=models.simplemodel.objects.get(id=5) #4查询指定id的 如果id不存在,就报错,出现大黄页 报错如下(不推荐) # print(obj_get_id) # obj_first=models.simplemodel.objects.all().first() #5查询所有的第一条 按照id顺序 # print(obj_first) # # obj_last=models.simplemodel.objects.all().last() #6查询所有的最后一条 按照id顺序 # print(obj_last) #5查询-进阶 # obj_all=models.simplemodel.objects.all() #1查询所有 # print(obj_all.query) #输出原生sql # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" #2查询指定列 obj_all_column=models.simplemodel.objects.all().values("username") print(obj_all_column,type(obj_all_column)) #1列表中是字典 # [{'username': 'jack'}, {'username': 'alex1'}] <class 'django.db.models.query.QuerySet'> obj_all_column_list=models.simplemodel.objects.all().values_list("username") print(obj_all_column_list,type(obj_all_column_list)) #2列表中是元组 # [('jack',), ('alex1',)] <class 'django.db.models.query.QuerySet'> obj_all_column_list2=models.simplemodel.objects.all().values_list("id","username") print(obj_all_column_list2,type(obj_all_column_list2)) #3列表中是元组--前端的choice-下拉框 # [(4, 'jack'), (5, 'alex1')] #直接从数据库中取出这个元组,作为前端choice的选项--nok return HttpResponse("models2 ok")
6、数据库操作-进阶
# 数据库操作-进阶 #1 获取个数 count obj_count = models.simplemodel.objects.all().count() print(obj_count) #5 #2 大于小于 obj_gt=models.simplemodel.objects.filter(id__gt=7) #id大于7 print(obj_gt) #[<simplemodel: alex3>, <simplemodel: alex4>] print(obj_gt.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."id" > 7 obj_lt=models.simplemodel.objects.filter(id__lt=7) #id小于7 print(obj_lt) #[<simplemodel: jack>, <simplemodel: alex1>] print(obj_lt.query) #SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."id" < 7 #3 in(not in) obj_in = models.simplemodel.objects.filter(id__in = [4,5,7]) #id in # obj_in = models.simplemodel.objects.filter(username__in = ["jack","alex1"]) #username in print(obj_in) #[<simplemodel: jack>, <simplemodel: alex1>, <simplemodel: alex2>] print(obj_in.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."id" IN (4, 5, 7) obj_notin = models.simplemodel.objects.exclude(id__in = [4,5,7]) print(obj_notin) #[<simplemodel: alex3>, <simplemodel: alex4>] print(obj_notin.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE NOT ("app01_simplemodel"."id" IN (4, 5, 7)) #4 contains (模糊匹配 like) 包含 不包含 是否区分大小写 obj_contains = models.simplemodel.objects.filter(username__contains = "alex") #1包含(区分大小写) print(obj_contains) #[<simplemodel: alex1>, <simplemodel: alex2>, <simplemodel: alex3>, <simplemodel: alex4>] print(obj_contains.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE %alex% ESCAPE '\' obj_notcontains = models.simplemodel.objects.exclude(username__contains = "alex") #2不包含 print(obj_notcontains) # [<simplemodel: jack>] print(obj_notcontains.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE NOT ("app01_simplemodel"."username" LIKE %alex% ESCAPE '\') obj_icontains = models.simplemodel.objects.filter(username__icontains = "Alex") #1包含(不区分大小写) print(obj_icontains) #[<simplemodel: alex1>, <simplemodel: alex2>, <simplemodel: alex3>, <simplemodel: alex4>] print(obj_icontains.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE %Alex% ESCAPE '\' #5 range (between and) obj_range=models.simplemodel.objects.filter(id__range =[5,7]) print(obj_range) #[<simplemodel: alex1>, <simplemodel: alex2>] print(obj_range.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."id" BETWEEN 5 AND 7 # 其他类似 # # startswith,istartswith, endswith, iendswith, #6 开头结尾模糊匹配 obj_startswith = models.simplemodel.objects.filter(username__startswith = "ja") #1开头模糊匹配 区分大小写 print(obj_startswith) #[<simplemodel: jack>] print(obj_startswith.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE ja% ESCAPE '\' obj_istartswith = models.simplemodel.objects.filter(username__istartswith = "jA") #2开头模糊匹配 不区分大小写 print(obj_istartswith) #[<simplemodel: jack>] print(obj_istartswith.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE jA% ESCAPE '\' obj_endswith = models.simplemodel.objects.filter(username__endswith = "ck") #3结尾模糊匹配 区分大小写 print(obj_endswith) #[<simplemodel: jack>] print(obj_endswith.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE %ck ESCAPE '\' obj_iendswith = models.simplemodel.objects.filter(username__iendswith = "CK") #2开头模糊匹配 不区分大小写 print(obj_iendswith) #[<simplemodel: jack>] print(obj_iendswith.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" WHERE "app01_simplemodel"."username" LIKE CK% ESCAPE '\' #7 排序 obj_order_asc = models.simplemodel.objects.all().order_by("username") #asc 1升序 print(obj_order_asc) #[<simplemodel: alex1>, <simplemodel: alex2>, <simplemodel: alex3>, <simplemodel: alex4>, <simplemodel: jack>] print(obj_order_asc.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" ORDER BY "app01_simplemodel"."username" ASC obj_order_desc = models.simplemodel.objects.all().order_by("-username") #desc 2降序 print(obj_order_desc) # [<simplemodel: jack>, <simplemodel: alex4>, <simplemodel: alex3>, <simplemodel: alex2>, <simplemodel: alex1>] print(obj_order_desc.query) # SELECT "app01_simplemodel"."id", "app01_simplemodel"."username", "app01_simplemodel"."password" # FROM "app01_simplemodel" ORDER BY "app01_simplemodel"."username" DESC # #8 # limit 、offset 适用场景:分页 --nok # # models.Tb1.objects.all()[10:20] # obj_limit = models.simplemodel.objects.all()[1,2] #存在报错 # print(obj_limit) #9 # group by 分组函数 聚合函数 from django.db.models import Count, Min, Max, Sum #导入 # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" obj_group_count = models.simplemodel.objects.all().values("id").annotate(c=Count("id")) #1c是列的别名 Count print(obj_group_count) # [{'id': 4, 'c': 1}, {'id': 5, 'c': 1}, {'id': 7, 'c': 1}, {'id': 8, 'c': 1}, {'id': 9, 'c': 1}] print(obj_group_count.query) # SELECT "app01_simplemodel"."id", COUNT("app01_simplemodel"."id") AS "c" # FROM "app01_simplemodel" GROUP BY "app01_simplemodel"."id" #2min 最小数 obj_group_min = models.simplemodel.objects.all().values("id1").annotate(num=Min("num")) #2num是列的别名 Min print(obj_group_min) # [{'num': 11, 'id1': 1}, {'num': 34, 'id1': 2}] print(obj_group_min.query) # SELECT "app01_simplemodel"."id1", MIN("app01_simplemodel"."num") AS "num" # FROM "app01_simplemodel" GROUP BY "app01_simplemodel"."id1" #3max 最大数 obj_group_max = models.simplemodel.objects.all().values("id1").annotate(max_num=Max("num")) #3max_num是列的别名 Max print(obj_group_max) # [{'max_num': 23, 'id1': 1}, {'max_num': 67, 'id1': 2}] print(obj_group_max.query) # SELECT "app01_simplemodel"."id1", MAX("app01_simplemodel"."num") AS "max_num" # FROM "app01_simplemodel" GROUP BY "app01_simplemodel"."id1" #4sum 求和 obj_group_sum = models.simplemodel.objects.all().values("id1").annotate(sum_num=Sum("num")) #4sum_num是列的别名 Max print(obj_group_sum) # [{'sum_num': 34, 'id1': 1}, {'sum_num': 157, 'id1': 2}] print(obj_group_sum.query) # SELECT "app01_simplemodel"."id1", SUM("app01_simplemodel"."num") AS "sum_num" # FROM "app01_simplemodel" GROUP BY "app01_simplemodel"."id1"
7

浙公网安备 33010602011771号