【问题标题】:Django: Correct request to database to calculate DAUDjango:正确请求数据库以计算 DAU
【发布时间】:2018-06-28 18:40:50
【问题描述】:

有人能在我对 Django 数据库的请求中发现错误吗? 所以,我有下一个模型:

class GameEvent(models.Model):    
    game = models.ForeignKey(Game, blank=False, on_delete=models.CASCADE)    
    name = models.CharField(max_length=255, blank=False)
    app_id = models.CharField(max_length=255, blank=False)
    datetime = models.DateTimeField(blank=False)        
    def __str__(self):      
        return u"%s [ %s ]" % (self.game.title, self.name)

@receiver(models.signals.pre_save, sender=GameEvent)
def update_datetime(sender, instance, **kwargs):
    instance.datetime = datetime.datetime.now()

每当我的游戏向我发送一些事件(例如:关卡完成、关卡失败等)时,我都会在数据库中创建记录。为了识别哪个应用程序副本向我发送了该副本具有唯一 app_id 的事件。所以问题是如何计算DAU。我向数据库发出下一个请求,但它返回错误的答案:

dau = GameEvent.objects.filter(game = game, datetime__gte = date_start, datetime__lte = date_end)
           .extra({'date' :'date(datetime)'})
           .values('date')
           .annotate(count=Count('app_id', disntict=True))
           .order_by('date')   

如果我选择一天的日期范围,它会返回 dau[0].count = 1200, 但是下一个计算唯一 app_id 计数的请求返回 100:

app_ids = GameEvent.objects.filter(game = game, datetime__gte = date_start, datetime__lte = date_end)
           .values_list('app_id', flat=True).distinct() 

那么,错误在哪里? 感谢您的帮助

【问题讨论】:

  • 如何确定app_id 是唯一的?
  • 第一次查询时拼写错误。
  • 当玩家安装游戏时,它会向游戏服务器请求 app_id,服务器选择唯一的并返回给应用程序

标签: python mysql django django-queryset django-database


【解决方案1】:
dau = GameEvent.objects.filter(game = game, datetime__gte = date_start, datetime__lte = date_end)
           .extra({'date' :'date(datetime)'})
           .values('date')
           .annotate(count=Count('app_id', distinct=True))
           .order_by('date')   

似乎不同的拼写是错误的。

另一点是您是否为时区等进行了正确的日期时间格式化。

【讨论】:

  • 哇!太好了,您发现这很有用,您可以接受答案。
猜你喜欢
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多