Python Django每月从DateField获得不同的查询集

时间:2018-05-29 06:23:12

标签: python django django-rest-framework

class MyModel(models.Model):
    TRANSACTION_TYPE_CHOICES = (
        ('p', 'P'),
        ('c', 'C'),
    )
    status = models.CharField(max_length=50, choices=TRANSACTION_TYPE_CHOICES, default='c')
    user = models.ForeignKey(User, db_index=True, on_delete=models.CASCADE,related_name='user_wallet')
    date = models.DateField(auto_now=True)
    amount = models.FloatField(null=True, blank=True)


    def __unicode__(self):
        return str(self.id)

我是Python django的新人,对Django Rest Framework有一点了解。

我有一个像上面这样的模型,我希望按月过滤日期字段,并按月获得不同的查询集.....有没有默认的方法来执行此操作...

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以将TruncMonthannotations

一起使用
from django.db.models.functions import TruncMonth

MyModel.objects.annotate(
    month=TruncMonth('date')
).filter(month=YOURVALUE).values('month').distinct()

或者如果您只需要逐月过滤日期,则可以使用__month选项

MyModel.objects.filter(date__month=YOURVALUE).distinct()

年长的django 你可以使用extra,例如postgres

MyModel.objects.extra(
    select={'month': "EXTRACT(month FROM date)"},
    where=["EXTRACT(month FROM date)=%s"],
    params=[5]
    # CHANGE 5 on you value
    ).values('month').distinct()

答案 1 :(得分:0)

这可能对您有所帮助

MyModel.object.values('col1','col2',...,'date').distinct('date')

或试试这个:

from django.db.models.functions import TruncMonth
MyModel.objects
    .annotate(month=TruncMonth('date'))  # Truncate to month and add to select list
    .values('month')                          # Group By month
    .annotate(c=Count('id'))                  # Select the count of the grouping
    .values('month', 'c')                     # (might be redundant, haven't tested) select month and count