【问题标题】:How to get the no of times a user visited a shop on each date(activity_date) from the model using a single query如何使用单个查询从模型中获取用户在每个日期(活动日期)访问商店的次数
【发布时间】:2017-11-23 00:12:32
【问题描述】:
class StoreLog(models.Model):
    user_id = models.ForeignKey(User, verbose_name=_('User'), related_name='user_analytics_data', null=True, blank=True)
    store_id = models.IntegerField(verbose_name=_('Store'))
    device_id = models.TextField(
        verbose_name=_("Device ID"), db_index=True,
        help_text=_("ANDROID_ID / TelephonyManager.getDeviceId() (always as hex)")
    )
    device_type = models.TextField(verbose_name=_("Device Info"), blank=True, null=True)
    activity_date = models.DateTimeField(_('Date'), default=timezone.now)

目标:如果用户在特定日期多次访问商店,则应发送一封邮件以提供一些优惠

【问题讨论】:

  • 你必须创建一个新表来存储用户访问
  • @ArpitSolanki 你能再解释一下吗?
  • 创建一个包含用户名访问日期时间的表,然后使用聚合查询来获取用户是否在一天内访问了多次。

标签: django database orm


【解决方案1】:

假设我正确理解 StoreLog 对象是访问商店的用户的单个实例的记录,您可以像这样查询该表:

# Period of "the last 2 weeks"
start = datetime.datetime.now() - timedelta(days=14)
end = datetime.datetime.now()

visits = StoreLog.objects.filter(
    user_id=THEUSER,
    activity_date__range=[start, end],
)

这将返回一个查询集,其中包含过去 2 周内发生的涉及该特定用户的所有 StoreLogs。

要获得计数,您只需要这样做

visit_count = visits.count()

从那里,您可以使用命令执行以下操作,向符合您条件的用户发送电子邮件:

# Period set to just one day
start = datetime.datetime.now() - timedelta(days=1)
end = datetime.datetime.now()

for user in User.objects.all():
    visits = StoreLog.objects.filter(
        user_id=user,
        activity_date__range=[start, end],
    )
    if visits.count() > 1:
        send_email_to_user(user)

要使其特定于商店,您还需要将 shop_id 传递给查询条件。

【讨论】:

  • 我们可以通过知道用户实例在我们设置的时间段内是否多次访问特定商店来了解用户最喜欢的商店,并且我们发送的电子邮件应该通知他他最喜欢的商店商店交易/优惠
猜你喜欢
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2011-01-25
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多