Django - ORM使用记录(二)

2019-06-05  本文已影响0人  憧憬001
ORM查询
管理器方法 返回类型 说明
模型类.objects.all() QuerySet 返回表中所有数据
filter() QuerySet 返回符合条件的数据
values() ValuesQuerySet(QuerySet的子类) 返回一个列表 每个元素为一个字典
values_list() ValuesListQuerySet(QuerySet的子类) 返回一个列表,不过它的元素不是字典,而是元组
get() 模型对象 返回一个满足条件的对象; 如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常; 如果找到多个,会引发模型类.MultiObjectsReturned 异常
first() 模型对象 返回第一条数据
last() 模型对象 返回最后一条数据
exclude() QuerySet 返回不符合条件的数据
order_by() QuerySet 对查询结果集进行排序
reverse() QuerySet 对排序的结果反转
count() int 返回查询集中对象的数目
exists() bool 判断查询的数据是否存在
from django.db import models
from django.db.models import F

class User(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    both = models.CharField(max_length=20)

不使用F()

s = User.objects.get(name='xxx')
s.age += 1
s.save()

将对象从数据库中查出来放到内存中,然后计数,再存入到数据库中

使用F()

s = User.objects.get(name='xxx')
s.age = F('age') + 1
s.save()

直接在数据库中查出数据,计数后更改数据库

>>> python manage.py shell
>>> from django.db.models import Q
>>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who')   # 正确,但不要这样混用
>>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
Q(question__startswith='Who'))  # 推荐,全部是Q对象
>>> Poll.objects.get( (Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))&
Q(question__startswith='Who'))  # 与上面语句同意,&代替”,”,可读性差

Q类中时应该可以使用F类吗?? 有兴趣的可以试一下

示例:

from django.db.models import Count
s = User.objects.all().annotate(n=Count('age'))
s = User.objects.values('name').distinct()
from django.db.models import Count
# 这是用*args的形式,最好不要这样用
s = User.objects.aggregate(Count('name'))
# 这是用**kwargs的形式
s = User.objects.aggregate(n=Count('name'))
s = User.objects.extra(select={'is_recent':"both>'2000-01-01'"})s
上一篇 下一篇

猜你喜欢

热点阅读