zoukankan      html  css  js  c++  java
  • django orm单表操作

    orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执行

    增:

    方式1:
        new_obj = models.UserInfo(
            id=2,
            name='小猿1',
            bday='2019-09-27',
            checked=1,
        )
        new_obj.save() 
    方式2:
    	# ret 是创建的新的记录的model对象(重点)
    	ret = models.UserInfo.objects.create( 
            name='小猿2',
            bday='2019-08-07',
            checked=0
        )
    # objects相当于一个控制器,它可以控制这个类给这个类一些操作方法,比如增删改查等
    
        print(ret)  #UserInfo object  ret是实例化对象   
        print(ret.name)    # 获取当前实例化对象的name值
        print(ret.bday)  
    

    时间问题

    models.UserInfo.objects.create(
            name='大猿2',
            bday=current_date,
            # now=current_date,  直接插入时间没有时区问题
            checked=0
        )
    #但是如果让这个字段自动来插入时间,就会有时区的问题,auto_now_add创建记录时自动添加当前创建记录时的时间,存在时区问题
    now = models.DateTimeField(auto_now_add=True,null=True)  
    # null = True是因为以前的这个列是新加的,所以就会存在以前的那些数据中没有这个列的数据信息,而这个语句,默认是不允许为空的,所以为了不报错就会加这么一个条件
    解决方法:
        settings配置文件中将USE_TZ的值改为False
        USE_TZ = False  # 告诉mysql存储时间时按照当地时间来存,不要用utc时间
    #使用pycharm的数据库客户端的时候,时区问题要注意
    

    删:

    简单查询:filter()  -- 结果是queryset类型的数据里面是一个个的model对象,类似于列表
    	models.UserInfo.objects.filter(id=7).delete()  #queryset对象调用
    	models.UserInfo.objects.filter(id=7)[0].delete()  #model对象调用
    

    改:

    方式1:update
         models.UserInfo.objects.filter(id=2).update(
             name='篮子文',
             checked = 0,
         )
            
        错误示例,model对象不能调用update方法
        # models.UserInfo.objects.filter(id=2)[0].update(
        #     name='加篮子+2',
        #     # checked = 0,
        # )
        
    方式2 
        ret = models.UserInfo.objects.filter(id=2)[0]
        ret.name = '加篮子+2'
        ret.checked = 1
        ret.save()
        
    
    更新时的auto_now参数
    # 更新记录时,自动更新时间,创建新纪录时也会帮你自动添加创建时的时间,但是在更新时只有使用save方法的方式2的形式更新才能自动更新时间,有缺陷,放弃
        now2 = models.DateTimeField(auto_now=True,null=True)
        
        
    注意:更新操作时会有一个返回值,是一个int类型,不是返回一个queryset对象
    ret = models.Book.objects.filter(title='西游记').update(
        price = 500
    )
    print(ret)
    1
    

    批量插入(bulk_create)

        # bulk_create
        obj_list = []
        for i in range(20):
            obj = models.Book(
                title=f'头发的秘密{i}',
                price=20+i,
                publish_date=f'2019-09-{i+1}',
                publish='24期出版社'
            )
            obj_list.append(obj)
    
        models.Book.objects.bulk_create(obj_list)  #批量创建
    

    从post提交的数据获取值写入数据库的方法

    data = request.POST.dict() -- 能够将querydict转换为普通的python字典格式
    #创建数据
    	models.Book.objects.create(
                **data     # 将data中的字典打散
            )
            
    request.POST --  querydict类型 {'title': ['asdf '], 'price': ['212'], 'publish_date': ['2019-09-12'], 'publish': ['asdf ']}
    

    查询api:

    all()  结果为queryset类型
    
    filter 条件查询
    	ret = models.Book.objects.filter(title='头发的秘密7',publish='24期出版社') #and多条件查询
    	查询条件不能匹配到数据时,不会报错,返回一个空的queryset,<QuerySet []>,如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法
    	
    get()
    	ret = models.Book.objects.get() #得到的是一个model对象,有且只能有一个
    	1. 查不到数据会报错 :Book matching query does not exist.
        ret = models.Book.objects.get(name__startswith='斗罗大陆')
    	2. 超过一个就报错 :returned more than one Book -- it returned 13!
    
    exclude()  #排除
    	1.object能够调用,models.Book.objects.exclude(title__startswith='头发的秘密')	
    	2.queryset类型数据能够调用, models.Book.objects.all().exclude(title__startswith='头发的秘密')
    
    order_by()排序
    	models.Book.objects.all().order_by('-price','id')  #orderby price desc,id asc;
    
    reverse() 反转
    	models.Book.objects.all().order_by('id').reverse()  #数据排序之后才能反转
    	
    count() 计数,统计返回结果的数量
    	models.Book.objects.all().count() 
    first() 返回第一条数据,结果是model对象类型
    last()  返回最后一条数据,结果是model对象类型
    	# ret = models.Book.objects.all().first()
    	ret = models.Book.objects.all().last()
    	
    exists() 判断返回结果集是不是有数据	
    	models.Book.objects.filter(id=9999).exists() #有结果就是True,没有结果就是False
    
    values(返回的queryset,里面是字典类型数据)
    values_list(返回的queryset,里面是数组类型数据)
        ret = models.Book.objects.filter(id=9).values('title','price') 
        # ret = models.Book.objects.all().values_list('title','price')
        # ret = models.Book.objects.all().values()
        # ret = models.Book.objects.values()  #调用values或者values_list的是objects控制器,那么返回所有数据 
    
    distinct() 去重,配置values和values_list来使用
    	models.Book.objects.all().values('publish').distinct()
    

    filter双下划线查询

    1. __gt--- 大于,__gte ----  大于等于,  lt ---  小于, lte  -----   小于等于
        
         ret = models.Book.objects.filter(price__gt=35)  #大于
         ret = models.Book.objects.filter(price__gte=35) # 大于等于
         ret = models.Book.objects.filter(price__lt=35) # 小于等于
         ret = models.Book.objects.filter(price__lte=35) # 小于等于
        
    2. __range  在什么和什么之间  
         ret = models.Book.objects.filter(price__range=[35,38]) # 大于等35,小于等于38   # where price between 35 and 38
        
    3. __contains  --- #字段数据中包含这个字符串的数据都要
    
         ret = models.Book.objects.filter(title__contains='头发的秘密') 
         ret = models.Book.objects.filter(title__contains='头发的秘密')
            
    4. __icontains  -----     不区分大小写     
         ret = models.Book.objects.filter(title__icontains="python")  
         ret = models.Book.objects.filter(title__icontains="python")  
            
    5. __startswith  -----   以什么开头,istartswith  不区分大小写  
         ret = models.Book.objects.filter(title__startswith="py") 
    
    6. 某年某月某日:
    	 ret = models.Book.objects.filter(publish_date__year='2018') 
    	 ret = models.Book.objects.filter(publish_date__year__gt='2018')#2018写数字也可以
         ret = models.Book.objects.filter(publish_date__year='2019',publish_date__month='8',
         publish_date__day='1')
        
    7.找字段数据为空的双下滑线
    	models.Book.objects.filter(publish_date__isnull=True) #这个字段值为空的那些数据
        
    8. 等于这里面的任意一个的对象
    Book.objects.filter(price__in=[100,200,300]) 
    
  • 相关阅读:
    linux 中实现两列数据的互换
    linux中 sort h的作用
    max 内置函数,管理uv 编辑器下面的窗口的显示情况
    时时设定 uv 面板的位置,还有就是 关于属性打开界面的大小
    判断贴图大小很好 同时可以判断文件大小
    两条线中画终点
    锁定控制器,一般在绑定的时候很多用到
    用 脚本编辑器读脚本 也是编辑脚本
    进行随机旋转用于和并东西并
    排列顶点 uv 不过有很大问题
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/11666540.html
Copyright © 2011-2022 走看看