Django .first()和all[0]区别

first():

返回queryset中匹配到的第一个对象,如果没有匹配到对象则为None,如果queryset没有定义排序,则按主键自动排序。

all[0]:

与first不同,如果没有匹配到,会报IndexError错误。


first()是一个很方便的代码,相当于下面的代码:

try:
    p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
    p = None

first源码为:

    def first(self):
        """
        Returns the first object of a query, returns None if no match is found.
        """
        objects = list((self if self.ordered else self.order_by('pk'))[:1])
        if objects:
            return objects[0]
        return None

last()返回最后一个,同first()

### Django `db` 模块功能与使用教程 #### 一、Django ORM简介 Django 的核心特性之一是其对象关系映射器 (ORM),它允许开发者通过Python代码而不是SQL语句来操作数据库。这不仅简化了开发过程,还提高了应用程序的安全性可移植性[^1]。 #### 二、主要组件说明 - **Models**: 定义数据模型类,对应于数据库中的表结构。 - **QuerySets**: 提供了一种高效的方式查询、过滤以及遍历数据库记录集合。 - **Managers**: 默认情况下每个Model都有一个名为objects的Manager实例,用于执行各种类型的数据库操作。 ```python from django.db import models class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey('Author', on_delete=models.CASCADE) # 获取所有书籍列表 books = Book.objects.all() ``` #### 三、常用API概览 - 创建新纪录:利用model类实例化并保存到数据库中。 - 更新现有条目:先检索目标对象再修改属性值最后调用save方法提交更改。 - 删除指定项:找到对应的model对象之后调用delete()函数即可移除该条目的数据库记录。 - 执行复杂查询:支持链式调用来构建复杂的条件表达式,比如filter(), exclude()等。 ```python new_book = Book(title="New Title", author=some_author_instance) new_book.save() book_to_update = Book.objects.get(id=specific_id) book_to_update.title = "Updated Title" book_to_update.save() Book.objects.filter(author__name='John Doe').exclude(published_date__isnull=True).order_by('-published_date') ``` #### 四、事务管理 为了确保一系列相关联的操作要么全部成功完成,要么完全不发生,在处理涉及多个步骤的数据变更时可以启用事务控制机制。 ```python from django.db import transaction with transaction.atomic(): # 这里的所有数据库操作都会被包裹在一个单独的事物里 book_one = Book.objects.create(title="First Transactional Book") book_two = Book.objects.create(title="Second Transactional Book") raise Exception("Simulate an error") # 如果这里抛出了异常,则前面所有的改动都不会生效 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值