如何在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
相关产品推荐
相关产品推荐

