django 数据库 添加、修改、删除 操作

数据库操作

  • 通过如下命令进入shell

    python3 manage.py shell

  • 导入两个模型类,以便后续使用

    from books.models import BookInfo,HeroInfo

  1. 添加

    Save方法
    >>> from datetime import date
    >>> book = BookInfo(
    ... btitle='西游记',
    ... bpub_date=date(2000,2,2),
    ... bread=10,
    ... bcomment=10
    ... )
    >>> book.save()
    
    >>> hero = HeroInfo(
    ... hname='孙悟空',
    ... hgender=160,
    ... hbook=book
    ... )
    >>> hero.save()
    
    >>> hero2 = HeroInfo(
    ... hname='猪八戒',
    ... hgender=150,
    ... hbook_id=book.id
    ... )
    >>> hero2.save()
    

    Create方法

    >>> HeroInfo.objects.create(
    ... hname='沙悟净',
    ... hgender=140,
    ... hbook=book
    ... )
    <HeroInfo: 沙悟净>
    
  2. 修改

    修改更新有两种方法

    • save

      修改模型类对象的属性,然后执行save方法

      hero = HeroInfo.objects.get(hname='猪八戒')
      hero.hname = '猪悟能'
      hero.save()
      
    • update

      使用模型类.objects.filter().update(),会返回受影响的行数

      HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
      
  3. 删除

    删除有两种方法

    • 模型类对象delete

      hero = HerInfo.objects.get(id=12)
      hero.save()
      
    • 模型类.objects.filter().delete()

      hero = HerInfo.objects.filter(id=13).delete()
      
  4. 查询

    1. get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

    2. all查询多个结果

    3. count查询结果数量

      >>> from books.models import BookInfo,HeroInfo
      >>> BookInfo.objects.all()
      <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>]>
      >>> book = BookInfo.objects.get(btitle='西游记')
      >>> book.id
      5
      >>> BookInfo.objects.get(id=3)
      <BookInfo: 笑傲江湖>
      >>> BookInfo.objects.get(pk=3)
      <BookInfo: 笑傲江湖>
      
  5. 过滤查询

    实现SQL中的where功能,包括

    • filter过滤出多个结果
    • exclude排除掉符合条件剩下的结果
    • get过滤单一结果

    对于过滤条件的使用,上述三个方法相同,故仅以filter进行讲解

    过滤条件的表达语法如下

    • 属性名称__比较运算符=值
      # 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
      
    1. 相等

      exact: 表示判等。

      例:查询编号为1的图书

      BookInfo.objects.filter(id__exact=1)
      
      #可简写为:
      BookInfo.objects.filter(id=1)
      
    2. 模糊查询

      contains:是否包含

      ​ `说明:如果要包含%无需转义,直接写即可。

      例:查询书名包含’传’的图书

      BookInfo.objects.filter(btitle__contains='传')
      

      startswith、endswith:以指定值开头或者结尾

      例:查询书名以’部’结尾的图书

      BookInfo.objects.filter(btitle__endswith='部')
      

      注意:以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

    3. 空查询

      isnull:是否为null

      例:查询书名不为空的图书.

      BookInfo.objects.filter(btitle_isnull=False)
      
    4. 范围查询

      in:是否包含在范围内。

      例:查询编号为1或3或5的图书

      BookInfo.objects.filter(id__in=[1,3,5])
      
    5. 比较查询

      • gt 大于 (greater then)
      • gte 大于等于 (greater then equal)
      • lt 小于 (less then)
      • lte 小于等于 (less then equal)

      例:查询编号大于3的图书

      BookInfo.objects.filter(id__gt=3)
      

      不等于的运算符,使用exclude()过滤器。

      例:查询编号不等于3的图书

      BookInfo.objects.exclude(id=3)
      
    6. 日期查询

      year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

      例:查询1980年发表的图书。

      BookInfo.objects.filter(bpub_date__year=1980)
      

      例:查询1980年1月1日后发表的图书。

      BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
      
    7. F对象

      之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?

      答:

      ​ 使用F对象,被定义在Django.db.models。

      语法如下:

      F(属性名)
      

      例:查询阅读量大于等于评论量的图书

      from django.db.models.import F
      
      BookInfo.objects.filter(bread__gte=F('bcomment'))
      

      可以在F对象上使用算数运算

      例:查询阅读量大于2倍评论量的图书

      BookInfo.objects.filter(bread__gt = F('bcomment')*2)
      
    8. Q对象

      多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字

      查询阅读量大于20,并且编号小于3的图书

      BookInfo.objects.filter(bread__gt=20,id__lt=3)
      
      #||
      
      BookInfo.objects.filter(bread__gt=20.filter(id__lt=3))
      

      如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

      语法如下:

      Q(属性名__运算符=)
      

      例:查询阅读量大于20,并且编号小于3的图书,改写为Q对象如下。

      from django.db.models import Q
      
      BookInfo.objects.filter(Q(bread__gt=20)|Q(id__lt=3))
      

      Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

      例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现

      BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
      

      Q对象前可以使用~操作符,表示非not。

      例:查询编号不等于3的图书。

      BookInfo.objects.filter(~Q(pk=3))
      

    聚合函数

你可能感兴趣的:(python)