Count number of records by date in Django

后端 未结 5 966
失恋的感觉
失恋的感觉 2020-11-28 23:49

I have a model similar to the following:

class Review(models.Model):
    venue = models.ForeignKey(Venue, db_index=True)
    review = models.TextField()  
           


        
相关标签:
5条回答
  • 2020-11-29 00:07

    This should work (using the same MySQL specific function you used):

    Review.objects.filter(venue__pk=2)
        .extra({'date_created' : "date(datetime_created)"})
        .values('date_created')
        .annotate(created_count=Count('id'))
    
    0 讨论(0)
  • 2020-11-29 00:27

    Just for completeness, since extra() is aimed for deprecation, one could use this approach:

    from django.db.models.expressions import DateTime
    
    Review.objects.all().\
        annotate(month=DateTime("timestamp", "month", pytz.timezone("Etc/UTC"))).\
        values("month").\
        annotate(created_count=Count('id')).\
        order_by("-month")
    

    It worked for me in django 1.8, both in sqlite and MySql databases.

    0 讨论(0)
  • 2020-11-29 00:27

    If you were storing a date field, you could use this:

    from django.db.models import Count
    
    Review.objects.filter(venue__pk = 2)
        .values('date').annotate(event_count = Count('id'))
    

    Because you're storing datetime, it's a little more complicated, but this should offer a good starting point. Check out the aggregation docs here.

    0 讨论(0)
  • 2020-11-29 00:30

    Also you can define custom function:

    from django.db.models.expressions import Func
    
    # create custom sql function
    class ExtractDateFunction(Func):
        function = "DATE" # thats the name of function, the way it mapped to sql
    
    # pass this function to annotate
    Review.objects.filter(venue__pk=2)
          .annotate(date_created=ExtractDateFunction("datetime_created"))
          .values('date_created')
          .annotate(created_count=Count('id'))
    

    Just make sure that your DB engine supports DATE function

    0 讨论(0)
  • 2020-11-29 00:33

    Now that Extra() is being depreciated a more appropriate answer would use Trunc such as this accepted answer

    Now the OP's question would be answered as follows

    from django.db.models.functions import TruncDay
    
    Review.objects.all()
        .annotate(date=TruncDay('datetime_created'))
        .values("date")
        .annotate(created_count=Count('id'))
        .order_by("-date")
    
    0 讨论(0)
提交回复
热议问题