orm之单表操作

表记录(增-删-改-查)

1,增

  • 方式一:实例化对象就是一条表记录

    • save方法:翻译成SQL语句,然后调用pymysql,发送给服务端

    • Frank_obj = models.Student(name ="david",course="python",birth="2000-9-9",fenshu=80)
      Frank_obj.save()
      
  • 方式二:obj.create()创建

    •  models.Student.objects.create(name ="路明非",course="python",birth="1995-5-9",fenshu=88)
      

2,删

  • delete()

    • models.UserInfo.objects.filter(id=7).delete()  #queryset对象调用
      models.UserInfo.objects.filter(id=7)[0].delete()  #model对象调用
      
    • 也可以一次性删除多个对象,每个Queryset都有一个delete()方法,他一次性删除所有Queryset对象

    • 要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。

  • 删除所有对象

    • …all().delete()
  • 在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象

3,改

  • 方式一:update

    •  models.UserInfo.objects.filter(id=2).update(
               name='芬格尔',
               checked = 0,
          )
      
  • 方式二:save

    • ret = models.UserInfo.objects.filter(id=2)[0]
      ret.name = '芬格尔+2'
      ret.checked = 1
      ret.save()
      

4,查

  • all():结果为Queryset类型

  • filter 条件查询

    • 查询条件不能匹配到数据时,不会报错,返回一个空的queryset,<QuerySet []>

    • 如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法

    • ret = models.Book.objects.filter(条件1,条件2...)
      
  • get():只找一个

    • ret = models.Book.objects.get() #得到的是一个model对象,有且只能有一个
      
    • 查不到数据会报错 :Book matching query does not exist.

    • 超过一个就报错 :returned more than one Book -- it returned 13!

  • exclude():排除

    • obj对象排除

      • models.Book.objects.exclude(title__startswith=‘。。。’)
        
    • 寻找一类数据--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对象类型

    • ret = models.Book.objects.all().first()
      
  • last(): 返回最后一条数据,结果是model对象类型

    • ret = models.Book.objects.all().last()
      
  • exists(): 判断返回结果集是不是有数据

    • models.Book.objects.filter(id=9999).exists() #有结果就是True,没有结果就是False
      
  • values():返回的queryset,里面是字典类型数据

    • ret = models.Book.objects.filter(id=9).values('title','price') 
      <QuerySet [{'title': '龙族8', 'price': Decimal('67.00')}]>
      
    • ret = models.Book.objects.filter(id=9).values()
      <QuerySet [{'id': 9, 'title': '龙族8', 'price': Decimal('67.00'), 'publishDate': datetime.date(2019, 9, 9), 'publishHouse': '江南出版社'}]>
      
  • value_list():返回的queryset,里面是数组类型数据

    • ret = models.Book.objects.all().values_list('title','price')
      
      <QuerySet [('龙族0', Decimal('59.00')), ('龙族1', Decimal('60.00')), ('龙族2', Decimal('61.00')), ('龙族3', Decimal('62.00')), ('龙族4', Decimal('63.00')), ('龙族5', Decimal('64.00')), ('龙族6', Decimal('65.00')), ('龙族7', Decimal('66.00')), ('龙族8', Decimal('67.00')), ('龙族9', Decimal('68.00')), ('龙族10', Decimal('69.00')), ('龙族11', Decimal('70.00')), ('龙族12', Decimal('71.00')), ('龙族13', Decimal('72.00')), ('龙族14', Decimal('73.00')), ('龙族15', Decimal('74.00')), ('龙族16', Decimal('75.00')), ('龙族17', Decimal('76.00')), ('龙族18', Decimal('77.00')), ('龙族19', Decimal('78.00')), '...(remaining elements truncated)...']>
      
      
    • ret2 = Book.objects.filter(id=9).values_list('title', 'price')
      
      <QuerySet [('龙族8', Decimal('67.00'))]>
      
  • distinct() :去重

    • 配和values和values_list来使用

    • models.Book.objects.all().values('publish').distinct()
      

5,双下方法查询

  • Book.objects.filter(price__in=[100,200,300]) 
    #price值等于这三个里面的任意一个的对象
    
    Book.objects.filter(price__gt=100)  
    大于等于
    
    Book.objects.filter(price__lt=100)
    小于等于
    
    Book.objects.filter(price__range=[100,200]) 
    #sql的between and,大于等于100,小于等于200
    
    Book.objects.filter(title__contains="python")  
    #title值中包含python的
    
    Book.objects.filter(title__icontains="python") 
    #不区分大小写
    
    Book.objects.filter(title__startswith="py") 
    #以什么开头,istartswith  不区分大小写
    
    Book.objects.filter(pub_date__year=2012)
    
  • 某年某月某日:
    	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')
    
  • 找字段数据为空的双下滑线
    	models.Book.objects.filter(publish_date__isnull=True) #这个字段值为空的那些数据
    

在Django项目中测试orm的增删改查:test.py

    '''
    import os
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM.settings")
        import django
        django.setup()
    # 注意!注意!注意!重要的事情说三遍,这里每段话位置都不能变。
    # 在django.setup()这里就可以写Django的代码了
    '''
posted @ 2019-12-16 16:58  阿浪阿浪  阅读(167)  评论(0编辑  收藏  举报