Python - Django - ORM 查询方法

Posted sch01ar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - Django - ORM 查询方法相关的知识,希望对你有一定的参考价值。

models.py:

from django.db import models


class Human(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    birthday = models.DateField(auto_now_add=True)

在数据库中添加几条数据

技术图片

 

在 Python 脚本中调用 Django 环境:

在 mysite2 下创建 orm_test.py

技术图片

在 orm_test.py 中添加以下内容:

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

 

ORM 操作:

all():查询所有结果

orm_test.py:

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.all()
    print(ret)

运行结果:

 技术图片

返回 QuerySet 对象,QuerySet 对象继承列表,所以可以使用列表的操作

get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret_id = models.Human.objects.get(id=2)
	print(ret_id)
    ret_name = models.Human.objects.get(name="Alex")
    print(ret_name)

 运行结果:

技术图片

filter():返回与所给筛选条件相匹配的对象

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.filter(id=3)
    print(ret)

运行结果:

技术图片

如果没有匹配上的话,不会报错,会返回一个空值

exclude():返回与所给筛选条件不匹配的对象

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.exclude(id=1)
    print(ret)

运行结果:

技术图片

返回除 id=1 外的所以数据

values():返回一个 ValueQuerySet,一个特殊的 QuerySet,运行后得到的并不是一系列 model 的实例化对象,而是一个可迭代的字典序列

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 返回所有字段名为 name 的数据
    ret = models.Human.objects.values("name")
    print(ret)
	
    # 返回所有字段名为 name 和 birthday 的数据
    ret1 = models.Human.objects.values("name", "birthday")
    print(ret1)

运行结果:

技术图片

返回的是字典类型

values_list():与 values() 相似,它返回的是一个元组序列,values 返回的是一个字典序列

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.values_list("name")
    print(ret)

运行结果:

技术图片

count():返回数据库中匹配查询 QuerySet 的对象个数

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.all().count()
    print(ret)

运行结果:

技术图片

first():返回第一条记录

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.all().first()
    print(ret)

运行结果:

技术图片

last():返回最后一条记录

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.all().last()
    print(ret)

运行结果:

技术图片

exists():如果 QuerySet 包含数据,就返回 True,否则返回 False

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.all().exists()
    print(ret)

运行结果:

技术图片

order_by():对查询结果按照某字段进行排序

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.order_by("name")
    print(ret)

运行结果:

技术图片

name 按照字母顺序进行了排序

在生成表的时候也可以指定默认的排序方法

models.py:

from django.db import models


class Human(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    birthday = models.DateField(auto_now_add=True)

    def __str__(self):
        return "<Human Object: >".format(self.name)
    
    # 按照 name 排序
    class Meta:
        ordering = ("name",)

这样生成的表在数据中就按 name 的字母顺序来排序

reverse():对查询结果反向排序

reverse() 通常只能在具有已定义顺序的 QuerySet 上调用(在model 类的 Meta 中指定 ordering 或调用 order_by() 方法)

import os

if __name__ == ‘__main__‘:
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    ret = models.Human.objects.order_by("name").reverse()
    print(ret)

运行结果:

技术图片

distinct():从返回结果中剔除重复纪录(如果查询跨越多个表,可能在计算 QuerySet 时得到重复的结果。此时可以使用 distinct(),注意只有在 PostgreSQL 中支持按字段去重)

以上是关于Python - Django - ORM 查询方法的主要内容,如果未能解决你的问题,请参考以下文章

python测试开发django-76.ORM查询之Q查询

python day-76 django orm 查询链表

python测试开发django-78.ORM查询之extra

Python - Django - ORM 分组查询补充

python web-Django ORM常用查询方式

python测试开发django(12)--ORM查询表结果