Django ORM中,如何使用Count來關聯對象的子集數量

来源:https://www.cnblogs.com/thomaszdxsn/archive/2019/03/28/Django-ORM-zhong-ru-he-shi-yongCount-lai-ji-suan-g.html
-Advertisement-
Play Games

有時候,我們想要獲取一個對象關聯關係的數量,但是我們不要所有的關聯對象,我們只想要符合規則的那些關聯對象的數量。 ...


有時候,我們想要獲取一個對象關聯關係的數量,但是我們不要所有的關聯對象,我們只想要符合規則的那些關聯對象的數量。

示例models

# models.py
from django.db import models


class Person(models.Model):
    name = models.CharField('名稱', max_length=32)
        
    def __str__(self):
        return self.name
        
        
class Task(models.Model):
    name = models.CharField('任務名稱', max_length=64)
    is_done = models.BooleanField('是否完成', default=False)
    owner = models.ForeignKey(Person, verbose_name='任務執行人')
    
    def __str__(self):
        return "{}({})".format(self.name, 'x' if self.is_done else 'o')

上面的代碼中,我們使用了兩個model,PersonTask。它們是一對多關係,一個用戶可能有多個任務。

那麼,我們怎麼來獲取一個用戶已完成任務的數量呢?

解決方法

一般來說,都是使用下麵這個辦法:

>>> person = Person.objects.first()
>>> person.task_set.all().count()
15
>>> person.task_set.filter(is_done=True).count()
10

這個辦法,確實可以解決問題。但是如果你有很多Person,都需要獲取已完成任務的數量,使用這個方法會依次對每個person的tasks集合使用單獨的SQL,開銷極大。

我們知道,Django ORM有一個aggregate函數,叫做Count。一般情況下,可以用它來獲取一個對象關聯對象的數量,並生成一個額外的computed欄位。而在Django2.0中1Count新加入了一個參數filter,使用它,可以在計算count數量之前先對集合進行過濾

>>> from django.db.models import Count, Q
>>> person = Person.objects.annotate(
...             Count('task_set', filter=Q(task_set__is_done=True))
...         ).first()
>>> person.task_set__count
10

而在Django2.0之前,我們應該怎麼辦呢?可以用SQL的Case/When來解決:

>>> from django.db.models import Count, When, Case
>>> person = Person.objects.annotate(Count(Case(When(task_set__is_done=True, then=0))).first()
>>> person.task_set__count
10

  1. Django API Reference: Count 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、由於項目需要進行手機看板展示設計及開發展示效果圖如下: 上圖為概況(點擊相應模塊進入詳情頁面) 上圖為運營統計(一些統計類圖標狀圖折線圖等......) 車輛分佈狀況(展示在地圖上分佈) 上圖為點擊一輛車的軌跡和運行情況 此產品唯一亮點在於完全可以把利用HTML5和echarts開發大數據大屏展 ...
  • 本文是BUAA OO課程Unit1在課程講授、三次作業完成、自測和互測時發現的問題,以及傾聽別人的思路分享所引起個人的一些思考的總結性博客。本文第二部分介紹三次作業的設計思路,主要以類圖的形式展現,並有簡單的優劣分析;第三部分為程式代碼複雜度的分析(二、三兩部分為基於度量的對自己程式結構的分析);第... ...
  • 一、前言 經過一個月來的學習,我從對面向對象一無所知到逐漸入門,圍繞著“多項式求導”,對面向對象的特性進行了探索。 我對面向對象印象最深的兩句話就是“萬物皆對象”和“高內聚、低耦合”,這三次作業也是儘量貫徹了這兩句話。 我們的作業從第一次的僅含冪函數的求導,到第二次包含正餘弦函數,再到最後函數可以嵌 ...
  • 一. 基於度量的程式結構分析 1. 第一次作業 這次作業是我上手的第一個java程式,使用了4個類來實現功能。多項式採用兩個arraylist來存,繫數和冪指數一一對應。 四個類分別為 Poly類,代表表達式; PolyDiff類,代表求導運算; PolyParse類,封裝了格式檢查,encodin ...
  • 前言 好的代碼需要有高內聚、低耦合、易擴展且擴展改動小等特點。說實話,我入行很久之後,才知道這些設計原則的名字,但是我並不覺得陌生,反而有一種理所當然的感覺。這得感謝自學時網路上前輩們推薦的書籍,培養了自己的代碼潔癖,還得感謝轉行後的第一個東家!以下只是我的理解,如有錯誤,請指正。 單一職責原則 顧 ...
  • return語句 return語句用來從一個函數中 返回 即跳出函數。當然也可以從函數中返回一個值。 運行結果 DocStrings Python有一個很奇妙的特性,稱為 文檔字元串 ,它通常被簡稱為 docstrings 。DocStrings是一個重要的工具,由於它幫助你的程式文檔更加簡單易懂, ...
  • 列表[List] 元組(truple) 字典{dict} 生成器(generator) 帶有 yield 的函數在 Python 中被稱之為 generator(生成器) 迭代器 iterator 迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代 ...
  • 預設參數 對於參數有時候我們希望他是可選的,前面介紹了函數柯里化,當然還有其他的解決方案。如果不想給某些參數提供值的話,就讓這寫參數使用預設值。在函數定義的時候給參數賦值使用(參數,參數=值......),從而給形參指定預設值。 註意預設參數的值是一個不可變的參數(也就是說預設參數是一個確定的值)。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...