码迷,mamicode.com
首页 > 其他好文 > 详细

B django模型系统(后续1)

时间:2019-03-15 23:09:40      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:gate   aggregate   ***   根据   imm   项目文件   ima   cti   一个   

1.数据库的链接配置

  djangomysql的连接流程

     安装--pip install  pymysql

     创建数据库用户

       有创建数据库的权限的用户

     创建数据库

       crm

     修改配置

       setings

DATABASES = {
    default: {
        ENGINE: django.db.backends.mysql,
        NAME: crm,
        USER:root,
        PASSWORD:qwe123,
        HOST:127.0.0.1,
        PORT:3306,
    }
}

修改项目文件(setings所在的文件夹)下的__init__.py文件

 写上

import pymysql
pymysql.install_as_MySQLdb()

2.djangoorm系统

https://baike.baidu.com/item/ORM/3583252?fr=aladdin

创建一个在编程文件可用的虚拟数据库or 将代码命令映射成数据库命令

模型类--数据表

类属性----表的字段名

3.模型的创建的和激活

  1模型类必须写在app下的models.py文件中

  2模型要映射到数据库  其所在的app必须要安装

小结:

   每一个模型都是django.db.models.Model的子类

   类变量 表示数据库字段(一列或者一行数据)

   每一个字段有一个字段类的实例表示

from django.db import models

# Create your models here.
class Student_User(models.Model):
    name = models.CharField(max_length=30) #字符串
    age =models.SmallIntegerField(default=18) #数字 默认值
    sex= models.SmallIntegerField(default=1)
    qq=models.CharField(max_length=20,default=‘‘)#字符串比int好操作
    phone=models.CharField(max_length=20,default=‘‘)
    c_time=models.DateTimeField(verbose_name=创建时间,auto_now_add=True) #提示给人看的
    ##auto_now_add=True #自动添加不用特地写
    ##
    对应sql语句
    --
    -- Create model Student_User
    --
    CREATE TABLE `video_student_user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `name` varchar(30) NOT NULL, 
    `age` smallint NOT NULL, 
    `sex` smallint NOT NULL, 
    `qq` varchar(20) NOT NULL, 
    `phone` varchar(20) NOT NULL, 
    `c_time` datetime(6) NOT NULL);
    COMMIT;

 

模型应用三步

  1配置

    数据库要先建立

    app要注册

  2建立模型                                                  

  3运行数据库迁移命令(在项目根目录下)

     1.python manage.py makemigrations appname

      告诉django我们做了哪些数据库更改 并希望时装

      目前只是做一个记录 还没touch数据库

      i.可以运行 python manage.py sqlmigrate appname 从迁移获取sql语句

    2.运行 python manage.py migrate appname  完成迁移

 

4.数据的增删改查

-工具 django shell 调试工具

  命令 python manage.py shell 进入调试工具

  导入

In [1]: from video.models import Student_User                                              

In [2]: Student_User.objects                                                               
Out[2]: <django.db.models.manager.Manager at 0x7fe4f810fcc0>

In [3]: Student_User.objects.all()                                                         
Out[3]: <QuerySet []>

-增加

  1.实例然后保存

In [4]: s1=Student_User(name=‘ziyu‘,age=‘20‘,qq=‘123456‘)                                  

In [5]: s1.save

  2.实例增加然后保存

In [8]: s2 =Student_User()                                                                 

In [9]: s2.name= ‘zy‘                                                                      

In [10]: s2.age= 18                                                                        

In [11]: s2.save()  

  3.直接创建

in[13]Student_User.objects.create(name=‘aa‘,age=‘23‘)

  4.查找或创建

In [5]: s=Student_User.objects.get_or_create(name=‘zy‘)                                    

In [6]: s                                                                                  

Out[6]: (<Student_User: zy-18>, False)  False 代表是否有过创建

 

显示

models的文件下面定义如下代码来修改 class.objecti.all()方法的输出结果

def __str__(self):
    return %s-%s%(self.name,self.age)

-查找

  1.查找全部

res= Student_User.objects.all()  # #res等于这条语句对应的sql语句并非等于这个运行结果 printres.query)查看对应的sql语句 (res可以for循环可以迭代可以切片)

  2.查找一条

Student_User.objects.getname=‘zy‘) 当有多条符合条件时报错(常常与pk代表主键这里是id连用)  Student_User.objects.getpk=2

  3.条件过滤(返回查询集)

res= Student_User.objects.filter(‘sex‘=1)

-修改

1.

  首先查到相应的数据

  然后直接赋值

  在保存

2.update(批量修改0

  例

  Student_User.object.filter(name=‘ziyu‘).update(age=‘20‘)

  不能与get连用可以与all连用

-删除  (update)

  先get

  然后 .delete

5.数据库的调用

from appname.models import classname
【变量name】= classname.objects.all()

模型的调用

--常用字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types

--常用字段类型的对应

  •  int --IntegetField
  •  varchar -- CharField
  •  longtext --TextField
  •  date -- DateField
  •  datetime --DateTimeField

--常用参数

https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options

primary_key:  指定是否为主键。

自定义主键的创建:AutoFieldprimary_key=ture

unique:  指定是否唯一。

null:  指定是否为空,默认为False

blank: 等于Trueform表单验证时可以为空,默认为False

default:  设置默认值。

DateField.auto_now:  每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是DateDateTime以及TimModel.save()方法才会调用e类才有的。

DateField.auto_now_add:  第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值

--常用查询方法

通过模型类上的管理器来构造Queryset

-模型类上的管理器是指  .object

-Queryset 表示数据库中对象的集合。

·-等同于select语句。惰性的

 all()获取所有记录(返回queryset)(queryset.query == mysql语句)

 first()返回第一条记录(返回一个数据对象)

 last()返回最后一条记录(...

   first()和last()-引出排序规则---默认通过主键。可以通过_meta设置

 get**kwargs)根据给定的条件获取一个对象,有对个符合条件的结果时报错

 filter**kwargs)根据给定的条件获取一个过滤后的queryset,多个条件逗号隔开。效果为and

 exclude**kwargs)(用法和filter相同结果相反)返回所有条件外的

 or 多条件查询:使用Q对象(例 filterQage=0|Qage=1)))

   需要导入from django.db.models import Q  

 values(*fields):返回相应字段返回一个queryset,返回一个字典列表。(fields:某字段)返回结果任然可以过滤

 only*fields):返回queryset,对象列表,(注意only一定会包含主键字段)

   对比value  对了一个key。返回结果不同。一般only比较高效。

 defer*fields)返回queryset,用法与only相同作用与only相反

 order_by*fields)根据给定的字段来来排序在字段名前加-反向排序例‘-name’

   考虑排序规则(尤其是在对中文排序时)

   多字段排序:(‘1字段‘2字段)则先按‘1字段排序在按‘2字段排序

 切片返回的多给对象都可以用列表的切片语法进行切片

   对应mysql里的LIMITOFFSET

   支持步长但是结果返回成列表(全部拿出来之后在切片不是在取值的时候切)效率不高

   不支持负索引

   ****注意 切完片之后不在支持,附加条件与排序

 

--常用查询条件(以双下划线来调用)

 exact 准确匹配  使用:在字段后加‘__exact‘ 例:(getid__exact=14))

 iexact 不分大小写 匹配  对应 mysql语法 LIKE(模糊匹配)使用:__

 contains 包涵   也是对应 LIKE BINARY %name%  例:(filter(name__contains=‘name‘))

 icontains 不分大小写包涵  LIKE %name%

 in 在一定范围内的条件下检索 例:(filter(name__in=[‘name‘,‘name1‘,‘name2‘]))

 range   数字版 的 in 例:(filter(name__range=1820)

 gt  大于  例:((filter(id__gt=18))大于18id

 gte 大于等于

 lt 小于

 lte小于等于

 startswith 以任意字符开头 对应 LIKE BINARY name% 例:filter(name__startswith=‘n‘)以n开头的name

 istartswith 大小写不敏感

 endswith

 iendswith

 isnull   返回 True False  对应 SQUry IS NULL IS NOT NULL例:res.filter(age__isnull=False) 不为空则返回

   注释:res= tablename.objetct.all()

 Lower() :例: order_byLower(‘name‘)

   导入 from django.db.models.function

   这时候order的反向方法不在适用应用order_byLower(‘name‘).desc()

    对应mysql里的DESC

--聚合

导入: from django.db.models import Count,Avg.Max,SumCount

然后通过 querysetaggregate的方法

  •  count  :计数  例子 res.filter(age__isnull=False) .count()
  •  平均值 res.aggregate(age_avg=Avg(‘age‘))
  •  极值:res.aggregate(age_max=Max(‘age‘))   (等号前的是自定义的名字)

--分组,聚合

  •  annoatenum=Count‘sex‘))
  •  例子:
In [10]: ress=Student_User.objects.values(sex).annotate(num=Count(sex))                
In [11]: ress                                                                              
Out[11]: <QuerySet [{sex: 1, num: 5}]>

 

B django模型系统(后续1)

标签:gate   aggregate   ***   根据   imm   项目文件   ima   cti   一个   

原文地址:https://www.cnblogs.com/zy0307/p/10540050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!