zoukankan      html  css  js  c++  java
  • DJango中ORM操作

    DJango中ORM操作

    Django中的ORM使我们可以在不使用繁琐的sql语句的情况下,通过一两行代码就可以完成对数据库的一些操作,在我们配置完Django的ORM相关属性后,在处理业务逻辑的views.py文件中,就可以使用如下代码来操作了

    1. models.表名.objects.create(字段1=值,字段2=值....)

    2. dict = {'字段1':值,'字段2':值.......}

      models.表名.objects.create(**dict)

    3. info = [models.表名(字段1=值,字段2=值....),models.表名(字段1=值,字段2=值...)...]

      models.表名.objects.bulk_create(info)

    models.表名.objects.filter(条件).delete()

    models.表名.objects.filter(条件).update(字段1=值,字段2=值...)

    单表查询

    1. res = models.表名.objects.all()

      得到res:[obj,obj......],每个obj都代表一行记录,可以点出字段名

    2. res = models.表名.objects.values()

      得到res:[{字段1:值,字段2:值......},{字段1:值,字段2:值......}......]

    3. res = models.表名.objects.values_list(字段1,字段2)

      得到res:[(字段1的值,字段2的值),(字段1的值,字段2的值)......]

    4. res = res = models.表名.objects.first()

      得到res:obj 第一条记录

    多表查询

    正向查询:查从表,通过外键获得主表内容

    res = models.从表名.objects.values(从表字段,外键名__主表字段)

    反向查询:查主表,通过小写主表名_set获得从表内容

    res = models.主表名.objects.values(主表字段,小写从表名_set.values(从表字段))

    各种带条件的查询

    1. 过滤(where 字段名 = 值)

      res = models.表名.objects.filter(字段名__gt=值)

      得到res:字段值大于值的记录

      res = models.表名.objects.filter(字段名__gte=值)

      得到res:字段值大于等于值的记录

      res = models.表名.objects.filter(字段名__lt=值)

      得到res:字段值小于值的记录

      res = models.表名.objects.filter(字段名__lte=值)

      得到res:字段值小于等于值的记录

    2. in和not in

      res = models.表名.objects.filter(字段名__in=[2,4,6....])

      相当于:where 字段名 in [2,4,6....]

      res = models.表名.objects.exclude(字段名__in=[2,4,6....])

      相当于:where 字段名 not in [2,4,6....]

    3. between...and...

      res = models.表名.objects.fliter(字段名__range=[6,9])

      相当于:where 字段名 between 6 and 9

    4. like

      res = models.表名.objects.fliter(字段名__startswith=字符)

      相当于:where 字段名 like '字符%'

      res = models.表名.objects.fliter(字段名__istartswith=字符)

      相当于上面的查询忽略大小写匹配

      res = models.表名.objects.fliter(字段名__endswith=字符)

      相当于:where 字段名 like '%字符'

      res = models.表名.objects.fliter(字段名__iendswith=字符)

      相当于上面的查询忽略大小写匹配

      res = models.表名.objects.fliter(字段名__contains=字符)

      相当于:where 字段名 like '%字符%'

      res = models.表名.objects.fliter(字段名__icontains=字符)

      相当于:上面的查询忽略大小写匹配

      res = models.表名.objects.fliter(字段名__regex='匹配规则')

      相当于以这个正则表达式;匹配规则'来进行查询

    5. count

      res = models.表名.objects.fliter(字段名__gt=值).count()

      得到:字段名的值大于值的记录的个数

    6. order by

      res = models.表名.objects.all().order_by('字段1','字段2'..)

      得到:根据先字段1再字段二再...来正序排序的记录

      res = models.表名.objects.all().order_by('-字段1','字段2'..)

      得到:根据先字段1再字段二再...来倒序排序的记录

    7. group by

      from django.db.models import Count, Min, Max, Sum
      res = models.表名.objects.values('作为分组依据的字段').annotate(别名=聚合函数('字段名'))

    8. limit

      res = models.表名.objects.all()[1:4]

      得到:第2,3,4条记录

    9. last

      res = models.表名.objects.last()

      得到:最后一条记录

    10. only

      res = models.表名.objects.only('字段名')

      只查询这个字段名

    11. defer

      res = models.表名.objects.defer('字段名')

      除了这个字段名都查

    12. or

      Q的使用:

      from django.db.models import Q

      res = models.表名.objects.filter( Q(Q(字段1__gt=值1) | Q(字段2=值2)) & Q(字段3=值3) )

      相当于:筛选出字段1大于值1或字段2等于值2的并且需要的记录要字段3等于值3

      F的使用

    ​ from django.db.models import F

    ​ models.UserInfo.objects.update(age=F('字段')+'1')

    ​ 相当于:将表中这个字段的值都加1

    1. 如果以上的方法不能满足需求,还可以使用原生sql语句

      from django.db import connection, connections

      cursor = connection.cursor()

      cursor.execute(''sql语句'', [参数])

      row = cursor.fetchone()

  • 相关阅读:
    i=i+2 与i+=2
    如何浏览github上所有的公开的项目?
    在ubuntu怎样修改默认的编码格式
    链式结构实现堆排序
    直接插入排序的哨兵的作用
    lk进kernel
    比劫劫财引发的灾如何化解呢?
    java:Map借口及其子类HashMap二
    java:Map借口及其子类
    java:集合输出之foreach输出三
  • 原文地址:https://www.cnblogs.com/acate/p/11353970.html
Copyright © 2011-2022 走看看