Skip to main content
 首页 » 编程设计

python之日期范围内的 Django 聚合

2025年05月04日25TianFang

我在这里潜伏和学习了一段时间。现在我有一个问题,不知何故我看不到一个简单的解决方案。为了学习 Django,我正在构建一个基本上跟踪预订项目的应用程序。 我想做的是显示某个项目在选定年份每月有多少天被预订。

我有以下模型:

Asset(Model) 
 
BookedAsset(Model): 
 asset = models.ForeignKey(Asset) 
 startdate = models.DateField() 
 enddate = models.DateField() 

所以有以下条目:

asset 1, 2010-02-11, 2010-02-13 
asset 2, 2010-03-12, 2010-03-14 
asset 1, 2010-04-30, 2010-05-01 

我想得到以下返回:

asset 1    asset 2 
-------    ------- 
Jan = 0    Jan = 0 
Feb = 2    Feb = 0 
Mar = 0    Mar = 2 
Apr = 1    Apr = 0 
May = 1    May = 0 
Jun = 0    Jun = 0 
Jul = 0    Jul = 0 
Aug = 0    Aug = 0 
Sep = 0    Sep = 0 
Oct = 0    Oct = 0 
Nov = 0    Nov = 0 
Dec = 0    Dec = 0 

我知道我需要先获取日期范围内的天数(并跟踪它们是否超出当前月份并进入下个月),然后对天数进行汇总。我只是想知道如何在 Django 中优雅地做到这一点。

非常感谢任何帮助(或正确方向的提示)。

请您参考如下方法:

我想不出用你的模型结构来做这件事的方法。

这是一个相当复杂的要求,无论您如何解决它,都可能需要相当多的自定义 SQL。我认为作为一个开始,您可能需要考虑更改您的结构,以便您拥有一个 BookedAssetDay 表,它分别代表预订的每一天。

class BookedAsset(models.Model): 
    asset = models.ForeignKey(Asset) 
    day = models.DateField() 

然后查询看起来像这样:

BookedAsset.objects.extra( 
    select={'month': 'MONTH(day)'} 
).values('asset', 'month').annotate(Count('bookedasset__month'))