Django orm 常用语句

61 阅读3分钟

创建(Create)

在 Django 模型中创建新的数据库记录:

from myapp.models import MyModel

# 创建一个新的实例
new_instance = MyModel(field_name='value', other_field_name=123)
# 将新实例保存到数据库
new_instance.save()

或者使用 create 方法,这会创建并保存新的实例:

new_instance = MyModel.objects.create(field_name='value', other_field_name=123)

检索(Retrieve)

获取数据库记录的操作通常使用 all, filter, exclude, get, 和 order_by 方法来实现。

  • 获取所有记录:
all_entries = MyModel.objects.all()
  • 使用条件过滤记录:
filtered_entries = MyModel.objects.filter(field_name='value')
entries_with_field_greater_than = MyModel.objects.filter(other_field_name__gt=100)
  • 不符合条件的记录:
excluded_entries = MyModel.objects.exclude(field_name='value')
  • 获取一个单一对象:
try:
    single_entry = MyModel.objects.get(pk=1)  # 'pk' 指的是主键
except MyModel.DoesNotExist:
    single_entry = None
  • 排序:
ordered_entries = MyModel.objects.order_by('field_name')

更新(Update)

更新操作可以对一个或多个对象进行。

  • 更新单个对象:
instance = MyModel.objects.get(pk=1)
instance.field_name = 'new_value'
instance.save()
  • 更新满足条件的多个对象:
MyModel.objects.filter(field_name='old_value').update(field_name='new_value')

删除(Delete)

删除记录也是很直接的:

  • 删除单个对象:
instance = MyModel.objects.get(pk=1)
instance.delete()
  • 删除满足条件的多个对象:
MyModel.objects.filter(field_name='value').delete()

聚合(Aggregation)

Django ORM 允许进行聚合操作,比如计数(Count)、平均值(Avg)、最大值(Max)、最小值(Min)等。

from django.db.models import Avg, Count, Max, Min
# 把所有记录的 other_field_name 字段的平均值
average_value = MyModel.objects.all().aggregate(Avg('other_field_name'))
# 把所有记录按 field_name 字段分组,并计算每组的记录数
count_per_field_name = MyModel.objects.values('field_name').annotate(count=Count('id'))

复合查询(Complex Queries)

利用 Q 对象,可以构建复杂的查询,比如 OR 和 AND 查询的组合:

  • 使用 Q 对象进行复杂查询:
from django.db.models import Q

# 假设想要查询 field_name 等于 'value1' 或者 other_field_name 大于 100 的所有记录
complex_query = MyModel.objects.filter(
    Q(field_name='value1') | Q(other_field_name__gt=100)
)

# 如果想要同时满足两个条件,可以将 | 换成 &
complex_query = MyModel.objects.filter(
    Q(field_name='value1') & Q(other_field_name__gt=100)
)

关联查询(Relationship Queries)

Django ORM 对于关联对象的查询也非常强大。如果模型之间有外键(ForeignKey)、多对多(ManyToManyField)或一对一(OneToOneField)的关系,可以便捷地跨关联查询数据。

  • 对于存在外键的关联模型:
# 假设 MyChildModel 有一个指向 MyModel 的外键关联 field
child_entries = MyChildModel.objects.select_related('my_model').filter(my_model__field_name='value')
  • 对于多对多关系:
# 如果 MyOtherModel 与 MyModel 有多对多的关系
related_entries = MyModel.objects.prefetch_related('myothermodel_set').filter(myothermodel__field_name='value')

切片(Slicing)

Django ORM 允许你对查询集进行类似 Python 列表的切片操作,这对于分页显示特别有用。

  • 取第 5 到第 10 条记录:
entries_slice = MyModel.objects.all()[5:10]

值列表(Values List)和扁平化(Flat)

如果你只需要一个模型中的几个字段值,你可以使用 values_list() 方法。

  • 获取特定字段的值列表:
name_list = MyModel.objects.values_list('field_name', flat=True)

使用 annotate 进行分组

当你需要根据某个字段对查询集合进行分组时,可以使用 annotate() 方法。

from django.db.models import Count

# 分组统计每个 field_name 下的记录数量
counts = MyModel.objects.values('field_name').annotate(count=Count('id'))

延迟加载(QuerySet Laziness)

Django 的 QuerySet 是延迟加载的,这意味着它们在实际需要执行数据库查询之前不会被执行。

调试查询(Debugging Query)

为了查看 Django ORM 构造出的实际 SQL 查询语句,你可以使用 query 属性。

print(MyModel.objects.all().query)