You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中计算用户产品访问记录的时间间隔

Django 访问记录时间间隔校验方案

1. 参考模型定义

首先你的访问记录模型可参考如下结构设计,保证有用户、关联产品、访问时间三个核心字段:

from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone

User = get_user_model()

# 你的产品模型示例,可根据实际业务调整
class Product(models.Model):
    name = models.CharField(max_length=128, verbose_name="产品名称")
    # 其他产品字段...

class ProductVisit(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="访问用户")
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="被访问产品")
    visit_time = models.DateTimeField(auto_now_add=True, verbose_name="访问时间")

    class Meta:
        # 默认按访问时间倒序排列,方便直接取最新的第一条记录
        ordering = ["-visit_time"]

2. 时间间隔计算与校验逻辑

核心逻辑为:用户触发访问行为时,先查询该用户对指定产品的最新访问记录,再通过datetime的差集计算间隔秒数,判断是否满足间隔要求:

from django.utils import timezone

def create_visit_if_allowed(user: User, product: Product):
    # 查询该用户对当前产品的最新访问记录
    latest_visit = ProductVisit.objects.filter(user=user, product=product).first()

    # 无历史访问记录,直接创建新记录
    if not latest_visit:
        ProductVisit.objects.create(user=user, product=product)
        return True

    # 计算当前时间与上次访问时间的差值,取总秒数
    time_gap = (timezone.now() - latest_visit.visit_time).total_seconds()

    # 1小时等于3600秒,满足间隔要求则创建新记录
    if time_gap >= 3600:
        ProductVisit.objects.create(user=user, product=product)
        return True
    # 不满足间隔要求,返回剩余等待时间(可选)
    return False, 3600 - int(time_gap)

3. 注意事项

  • 必须使用Django提供的timezone.now()获取当前时间,不要使用Python原生的datetime.now(),避免时区配置不同导致的时间计算误差
  • 计算时间差时要使用total_seconds()方法,不要直接用seconds属性:seconds只能获取0-86399范围内的数值,间隔超过1天的情况下会出现计算错误
  • 如需调整间隔时长,直接修改3600的数值即可,例如2小时为7200,30分钟为1800

内容的提问来源于stack exchange,提问作者user14769370

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:18:03