Django QuerySets Api-----不返回QuerySets的

1、get(**kwargs)
a、不存在或者返回多个,都会报错
b、querysets仅包含一条记录,可以不加参数直接调用get()

2、create(**kwargs)
a、Models.objects.create(**kwargs)等价于Models(**kwargs).save()
b、如果primary key为手工设置,则有可能已经存在,此时会报IntegrityError

3、get_or_create(defaults=None, kwargs)
a、查找,如果不存在,则创建。如果存在defaults,则
kwargs可以为空。 b、如果有多条记录匹配查找,则报错
c、如果查找到,这返回元组(object, False);如果未找到,则创建,并返回元组(object, True)
d、创建时defaults中key:value中的value可以为可调用对象,此对象的调用结果为最终value值,若kwargs中存在相同键值,则更新对应的value
e、在查找时,如果有field名为defaults,则关键字参数需要写成:defaults__形式
f、如果手工设置primary key,同create方法一样可能报IntegrityError
g、此方法可能存在竞争条件,并非原子操作,如果field未设置为unique,则有可能同时调用此函数的多个请求,会插入多条重复数据。
h、对应终端为mysql,必须设置隔离级别为READ COMMITTED,否则有可能出现IntegrityError,但接下来的get调用却查询不到数据的情况。
i、仅在POST中调用此方法
j、也适用于Many-to-Many Field,但查询应基于primary模型的语义上下文。如果查询不存在的关联对象,而此对象已存在,则会报IntegrityError。

4、update_or_create(defaults=None, **kwargs)
a、**kwargs为查找参数,如果查找到,则用defaults中的更新数据库,否则创建对象,类似get_or_update
b、同样存在race condition
c、primary key为手工设置时,可能报IntegrityError

5、bulk_create(objs, batch_size=None)
a、批量创建,减少数据库访问次数
b、内部并不调用save(),因此不会触发pre_save和post_save信号
c、在多对多关系或者多表继承的子表场景,不支持批量创建
d、如果primary key为autofield,objs中可以部分无primary key部分存在手工设置的(需要保证primary key唯一,否则报错)
e、objs可以为generator,
f、整个批量创建为一个事务

6、count()
a、返回QuerySets中的记录个数,等价于Select count(*)
b、如果继续游加载查询对象,有需要计算记录个数,则此种场景len(querysets),更高效

7、in_bulk(id_list=None, field_name=’pk’)
a、批量查询
b、如果id_list为[],则返回{}
c、field_name为2.0版本加入,低版本时默认为pk

8、iterator(chunk_size=2000)
a、直接读取结果,不缓存。适用于:读取数量大,且仅访问一次的场景
b、在QuerySets上使用iterator()调用,会造成重复查询
c、iterator和prefetch_related同时调用,会忽略prefetch_related调用,因为无意义
d、在支持服务端游标时,chunk_size为数据库驱动程序级别缓存的结果数量,越大可减少与数据库之间的往返次数;在不支持时,chunk_size控制Django从数据驱动程序检索的批量大小,越大可减少与驱动程序通信开支。前述两种情况,越大都会增加内存开销。

9、latest(**fields)
a、返回基于fields的排序最靠后的记录,在django2.0开始支持多个fields
b、如果Meta中定义了get_latest_by,则可以不携带参数,缺省使用该值
c、如果不存在,则报DoesNotExist
d、此方法方便使用,且可读性高
e、有可能返回的记录有null值,根据数据库而定,有些数据库认为null值最大或者最小于非null值,故可在latest或者earliest调用前加非空过滤。

10、earliest(*fields)
同latest相反

11、first()
a、返回QuerySet匹配的第一个object
b、没有则返回None
c、如果queryset未定义排序,则以pk排序

12、last()
同first方法相反

13、aggregate(*args, **kwargs)
a、返回聚合计算后的字典,匿名参数,返回字典的key为:field_method;关键字参数,返回字典的key为关键字
b、如果既有ForeignKey又有ManyToManyKey,则同时聚合时,ForeignKey会多计算

14、exists()
a、检查queryset中是否存在objects,可以检查特定对象是否存在,或者queryset是否为空;
b、此函数比后两种方法要高效:比迭代queryset检查特定对象是否存在,或者len(queryset)检查是否为空(此隐含操作也是查询数据库再检查是否为空)。当然,高效的不多,在queryset为很大时,效率提升比较明显

15、update(**kwargs)
a、批量更新field,返回数据库中符合条件记录个数,可能比实际update的多 b、立即执行sql,不调用objects上定义的任何方法,不触发pre_save或者post_save。不存在race condition,
c、如果定制了save方法,则此时不可调用update方法,而应该迭代queryset,逐个object调用save
d、分片出的queryset,不可以调用update

16、delete()
a、批量删除记录,外键关联对象根据on_delete定义的操作执行,多对多对象也会删除
b、分片出来的queryset不可以执行此操作
c、delete立即执行,不调用object上定义的delete方法,但是会级联删除,及触发pre_delete及post_delete
d、如果需要级联或者触发信号,则django需要查询objects至内存,但如果以上两者都不需要,则delete会立即执行SQL,此会大大提高性能

17、as_manager()
返回基于queryset一个manager

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值