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

 

posted @ 2016-05-09 11:52  王同佩  阅读(227)  评论(0)    收藏  举报