1. QuerySet对象简介
在Django中,QuerySet是非常常用的一个对象,它代表了一个数据库查询的结果集。使用Model.objects来获得一个QuerySet对象,其中Model是模型类的名称。我们可以通过QuerySet对象来执行各种查询、过滤、排序等操作,以及执行聚合和计数等操作。下面我们将详细介绍它的常用方法。
2. 查询数据
2.1 all()
all()方法返回所有对象的QuerySet对象,相当于不加任何限制条件的查询。
from myapp.models import Person
all_persons = Person.objects.all()
2.2 get()
get()方法返回符合条件的单个对象,如果找不到对象则抛出DoesNotExist异常,如果查询条件返回多个对象则抛出MultipleObjectsReturned异常。我们可以将参数以关键字参数的形式传递,例如:
try:
person = Person.objects.get(name='Alice')
except Person.DoesNotExist:
person = None
2.3 filter()
filter()方法返回符合条件的对象集合的QuerySet对象。可以使用多个参数,参数之间默认都是“AND”的关系,如果需要使用“OR”关系,可以使用Q对象。例如:
from django.db.models import Q
person_set = Person.objects.filter(Q(name='Alice')|Q(name='Bob'))
其中Q对象可以用来组合条件。
2.4 exclude()
exclude()方法与filter()方法作用相反,返回不符合条件的对象集合的QuerySet对象。例如:
person_set = Person.objects.exclude(name='Alice')
2.5 order_by()
order_by()方法用于对QuerySet对象进行排序,默认是升序排列。可以使用多个参数来进行多重排序。例如:
person_set = Person.objects.all().order_by('-age', 'name')
以上代码表示以年龄降序排列,年龄相同时以姓名升序排列。
3. 增加和修改数据
3.1 create()
create()方法可以同时创建并保存一个新对象到数据库中,相当于以下代码:
new_person = Person(name='Alice', age=20)
new_person.save()
可以直接使用以下代码:
new_person = Person.objects.create(name='Alice', age=20)
3.2 update()
update()方法用于批量更新符合筛选条件的对象的属性值。例如:
Person.objects.filter(name='Alice').update(age=21)
以上代码将所有名字为“Alice”的人的年龄更新为21岁。
4. 删除数据
4.1 delete()
delete()方法用于批量删除符合条件的对象。例如:
Person.objects.filter(name='Alice').delete()
以上代码将所有名字为“Alice”的人从数据库中删除。
5. 聚合和计数
5.1 count()
count()方法用于返回符合条件的对象数量。例如:
Person.objects.filter(name='Alice').count()
以上代码将返回名字为“Alice”的人的数量。
5.2 aggregate()
aggregate()方法用于执行聚合操作,例如对符合条件的对象求和、平均值等。以下代码演示了对年龄求和的操作:
from django.db.models import Sum
total_age = Person.objects.aggregate(Sum('age'))['age__sum']
6. 其他
6.1 select_related()
select_related()方法用于执行联表查询,它会返回一个包含关联对象的QuerySet对象,而不是返回外键对应的对象。这个方法可以大大提高查询效率,避免了多次查询数据库的操作。例如:
book_set = Book.objects.select_related('author')
以上代码将查询所有的书籍,并返回包含作者对象的QuerySet对象。
6.2 prefetch_related()
prefetch_related()方法可以用于执行反向关联联表查询,它可以一次性把相关联的所有对象全部查询出来,避免了多次查询数据库的操作。例如:
book_set = Book.objects.prefetch_related('comments')
以上代码将查询所有的书籍,并返回包含评论对象的QuerySet对象。
6.3 values()
values()方法用于返回符合条件的对象的特定字段的值的QuerySet对象。我们可以使用多个参数来指定字段。例如:
name_list = Person.objects.values('name')
以上代码将返回名字字段的值的QuerySet对象。
7. 总结
以上就是Django QuerySet对象的常用方法,我们可以根据需要来灵活使用。QuerySet对象的操作非常灵活,可以通过多个方法来组合使用,从而得到我们需要的结果。在使用QuerySet对象的过程中,我们应该掌握常用的方法,来提高数据库查询的效率。