Django数据库查询操作

1、查询所有记录:模型名.objects.all()

复制代码
    >>> from django.contrib.auth.models import User
    >>> users = User.objects.all()
    >>> users
    <QuerySet [<User: admin>, <User: zhanglaoshi>, <User: wanglaoshi>, <User: zhaolaoshi>,
    <User: zhoulaoshi>, <User: wulaoshi>, <User: danglaoshi>, <User: canglaoshi>, <User:
    hulaoshi>, <User: yinlaoshi>, <User: lulaoshi>, <User: chenlaoshi>, <User: kuanglaoshi>,
    <User: xiaodou>, <User: xiaojin>]>

查询结果保留在users序列中,获得序列中的一个元素,使用下述方式:

复制代码
    >>> lu = users[10]
    >>> lu
    <User: lulaoshi>
    >>> lu.email
    'lu@laoshi.com'

2、精确查询:模型名.objects.get(字段名=字段值)

括号里面的是查询条件,可以设置一个以上的查询条件,中间用','分开。

查询不到结果时:报错。

复制代码
    >>> BlogArticles.objects.get(id=1)
    <BlogArticles: php is the best computer language>
    >>> BlogArticles.objects.get(title="Canglaoshi is a good teacher")
    <BlogArticles: Canglaoshi is a good teacher>
    >>> BlogArticles.objects.get(title="teacher")
    Traceback (most recent call last):
      File "/usr/lib/python3.5/code.py", line 91, in runcode
        exec(code, self.locals)
      File "<console>", line 1, in <module>
      File "/usr/local/lib/python3.5/dist-packages/django/db/models/manager.py", line 85,
    in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 385, in
    get
        self.model._meta.object_name
    blog.models.DoesNotExist: BlogArticles matching query does not exist.

3、根据条件查询:模型名.objects.filter(过滤条件)

过滤不到结果时:返回空。

复制代码
    >>> users_laoshi = User.objects.filter(username__endswith="laoshi")
    >>> users_laoshi
    <QuerySet  [<User:  zhanglaoshi>,  <User:  wanglaoshi>,  <User:  zhaolaoshi>,  <User:
    zhoulaoshi>, <User: wulaoshi>, <User: danglaoshi>, <User: canglaoshi>, <User: hulaoshi>,
    <User: yinlaoshi>, <User: lulaoshi>, <User: chenlaoshi>, <User: kuanglaoshi>]>

这里查询出username中以"laoshi"这个字符串结尾的对象。

除filter()能够实现根据条件查询外,还有exclude()

复制代码
    >>> users = User.objects.filter(username__endswith="laoshi").exclude(id__gt=7)
    >>> users
    <QuerySet  [<User:  zhanglaoshi>,  <User:  wanglaoshi>,  <User:  zhaolaoshi>,  <User:
    zhoulaoshi>, <User: wulaoshi>, <User: danglaoshi>]>

4、查询结果排序

对于查询返回的QuerySet结果,默认是按照数据模型类中定义的字段排序的,如果要重新排序,可以使用order_by()方法。

复制代码
    >>> u = User.objects.filter(username__startswith="z").order_by("username")
    >>> u
    <QuerySet [<User: zhanglaoshi>, <User: zhaolaoshi>, <User: zhoulaoshi>]>
    >>> u = User.objects.filter(username__startswith="z").order_by("-username")
    >>> u
    <QuerySet [<User: zhoulaoshi>, <User: zhaolaoshi>, <User: zhanglaoshi>]>

order_by()的参数中可以写多个字段名称,即按照字段前后顺序分别作为排序的"主关键词"和"次关键词"。

5、使用外键查询

定义ArticleColumn模型时,定义外键user如下:

复制代码
user = models.ForeignKey(User, on_delete=models.CASCADE,
                             related_name='article_column')

说明User一条记录,可以对应多个ArticleColumn记录,是一对多的关系,并且通过user可以查到其对应的ArticleColumn记录。related_name='article_columns' 提供了从 User 实例访问关联的 ArticleColumn 实例的方便方式。

复制代码
user = User.objects.get(username='john_doe')
columns = user.article_columns.all()  # 获取所有与这个用户关联的 ArticleColumn 实例

如果没有定义related_name,则使用下述代码查询相关的ArticleColumn记录。

复制代码
user = User.objects.get(username='john_doe')
columns = user.articlecolumn_set.all()  # 使用默认的反向关系名称

articlecolumn_set中的articlecolumn是模型名。

相关推荐
名字还没想好☜3 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
ltl3 小时前
Serverless 数据库弹性理论:Neon 与 Aurora Serverless v2
数据库
YB13756 小时前
jetpack compose 副作用 SideEffect
android·kotlin
CHB8 小时前
uni-app x 蒸汽模式 性能测试基准报告 Benchmark【Android版】
android·ios·uni-app
marvelyu8 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
ZCBUS实时计算8 小时前
金融证券实时数仓建设实践:轻量化实时计算平台落地,实现交易数据端到端秒级处理
大数据·数据库·数据仓库·金融·flink·dba·etl
zd2005728 小时前
海洋微生物数据库
数据库·宏基因组
海上小飞龙9 小时前
Redis 分布式锁原理:从 SET NX EX 到 Redisson 看门狗
数据库·redis·分布式
带娃的IT创业者9 小时前
拆掉那堵墙:LibrePods 如何让 AirPods 在 Android 上重获新生
android·开源项目·airpods·librepods·生态解锁
xiaoye-duck9 小时前
MySQL 表约束全解:从基础约束到外键关联规则
数据库·mysql