如何使用 Django ORM 查询数据?

推荐答案

-- -------------------- ---- -------
- ------
---------------------

- ------
-------------------------

- ----
--------------------------------------

- ----
---------------------------------------

- ----
--------------------------------

- --------
-------------------------

- ----
---- ---------------- ------ ------ ---
-------------------------------------- -------------

- ----
-----------------------------------------------------

- -- - --------
---- ---------------- ------ -
---------------------------------------- - ----------

- -- - ---------
---- ---------------- ------ -
-------------------------------------------------------

本题详细解读

1. 查询所有数据

MyModel.objects.all() 返回 MyModel 表中的所有记录。这是一个惰性查询,只有在实际使用数据时才会执行数据库查询。

2. 查询单条数据

MyModel.objects.get(id=1) 返回 id 为 1 的记录。如果找不到记录或找到多条记录,会抛出 DoesNotExistMultipleObjectsReturned 异常。

3. 过滤查询

MyModel.objects.filter(name='example') 返回 name 字段为 'example' 的所有记录。filter 方法返回的是一个 QuerySet,可以进一步链式调用其他方法。

4. 排除查询

MyModel.objects.exclude(name='example') 返回 name 字段不为 'example' 的所有记录。与 filter 类似,exclude 也返回一个 QuerySet

5. 排序查询

MyModel.objects.order_by('name') 返回按 name 字段升序排列的所有记录。如果要降序排列,可以使用 order_by('-name')

6. 限制查询结果数量

MyModel.objects.all()[:5] 返回前 5 条记录。Django 的 QuerySet 支持切片操作,类似于 Python 的列表切片。

7. 聚合查询

MyModel.objects.aggregate(Count('id'), Avg('price')) 返回一个字典,包含 id 字段的计数和 price 字段的平均值。aggregate 方法用于对 QuerySet 进行聚合操作。

8. 关联查询

MyModel.objects.select_related('related_model').all() 返回 MyModel 表中的所有记录,并预加载 related_model 的关联数据。select_related 用于优化一对一或多对一关系的查询。

9. 使用 Q 对象进行复杂查询

MyModel.objects.filter(Q(name='example') | Q(age=25)) 返回 name'example'age 为 25 的所有记录。Q 对象允许构建复杂的查询条件。

10. 使用 F 表达式进行字段比较

MyModel.objects.filter(price__gt=F('discounted_price')) 返回 price 大于 discounted_price 的所有记录。F 表达式用于在查询中引用模型字段的值。

纠错
反馈