QuerySet

get_or_create

会返回一个tuple,第一个值是查到或者创建的数据,第二个值是一个布尔,表示是否执行了创建操作。

values and values_list

  • values("comment_id")方法返回包含字典的QuerySet
<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
  • values_list() 方法返回一个包含元组的QuerySet:
<QuerySet [(1,), (2,)]>

如果您使用values_list()单个字段,则可以使用flat=True返回单个值的QuerySet而不是1个元组:

<QuerySet [1, 2]>

defer和only

  • Defer方法的用途是查询数据库时跳过指定的字段,比如下面查询时将跳过每篇Entry的headline和body字段。当你不需要在查询结果中使用headline和body字段时,使用defer方法可以防止将headline和body载入内存,从而节省空间。一篇文章可能没啥关系,但文章很多时,节省的内存空间不可忽视。
  • Only方法与defer方法作用类时,只不过only方法是指定需要载入的字段。比如下面查询将只会载入body和pub_date。

原文链接:https://blog.csdn.net/weixin_42134789/article/details/102639721

  • select_related 针对Forenkey字段使用
  • prefetch_related 针对ManyToManyField字段使用

Subquery

  • 用于子查询
from django.db.models import Subquery
ApprovalConfigRelation.objects.exclude(
                approval_config_key__in=Subquery(
                    ApprovalConfig.objects.values("approval_config_key")
                )

annotate

  • 聚合函数需要和annotate配合才能使用,返回值里面会多个refer_count属性,就是你聚合的结果。
result = Template.objects.all().annotate(
refer_count=Count("approvalconfigrelation")
)

F

针对对象某字段的改变,使用数据库层面计算,而不是python代码层面计算

Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)

注意

  1. F() 赋值在 Model.save() 之后持续存在
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()

reporter.name = 'Tintin Jr.'
reporter.save()

在这种情况下,stories_filed 将被更新两次。如果最初是 1,最终值将是 3。这种持久性可以通过在保存模型对象后重新加载来避免,例如,使用 obj.refresh_from_db()。

https://docs.djangoproject.com/zh-hans/3.2/ref/models/expressions/

意外的结果

Django版本 1.11.8、2.0。
image

posted @ 2021-08-02 10:24  Tank-Li  阅读(143)  评论(0编辑  收藏  举报