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

如何在Django中实现资源下载计数器及后台展示功能

Django资源下载次数统计及Admin展示实现方案

1. 调整资源模型新增统计字段

首先在你的资源对应Model中新增下载次数字段,使用IntegerField默认值为0,设置editable=False避免后台手动修改计数:

from django.db import models

class Resource(models.Model):
    name = models.CharField("资源名称", max_length=200)
    file = models.FileField("资源文件", upload_to="resources/")
    # 下载统计字段,默认0,禁止手动直接编辑
    download_count = models.IntegerField("累计下载次数", default=0, editable=False)
    # 其余自定义字段...

    def __str__(self):
        return self.name

2. 编写下载视图更新计数

用户触发下载请求时,先更新计数再返回文件响应,注意不要直接用resource.download_count +=1再save的写法,并发场景下会出现计数丢失的问题,必须用F表达式配合update方法实现数据库层面的原子操作:

from django.db.models import F
from django.http import FileResponse
from .models import Resource

def download_resource(request, resource_id):
    resource = Resource.objects.get(id=resource_id)
    # 原子更新下载次数
    Resource.objects.filter(id=resource_id).update(download_count=F("download_count") + 1)
    # 返回文件下载响应
    response = FileResponse(resource.file.open('rb'))
    response['Content-Disposition'] = f'attachment; filename="{resource.name}"'
    return response

配置好对应路由后,前端下载按钮的href指向该视图的访问地址即可。

3. 配置Admin后台显示字段

在admin注册类中配置列表页展示下载次数,同时将该字段加入只读字段列表,保证后台可见但不可随意修改:

from django.contrib import admin
from .models import Resource

@admin.register(Resource)
class ResourceAdmin(admin.ModelAdmin):
    # 列表页展示字段,新增下载次数字段
    list_display = ("id", "name", "download_count")
    # 非可编辑字段需要加入只读列表才能在详情页显示
    readonly_fields = ("download_count",)
    # 可选配置:默认按下载次数倒序排列,方便快速查看热门资源
    ordering = ("-download_count",)

可选优化点

  • 若需要避免同一用户重复下载刷量,可额外新建DownloadLog模型存储下载记录(关联用户ID、资源ID、下载时间),每次触发下载前校验当前用户是否已下载过该资源,再决定是否累加计数
  • 未做用户登录体系的站点可通过IP+浏览器Cookie标记的方式做重复下载校验,统计精度会略低
  • 所有代码修改完成后执行python manage.py makemigrations和python manage.py migrate完成数据库字段迁移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:36:03