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()

原文地址:https://www.cnblogs.com/acate/p/11353970.html