如何统计并展示最受浏览产品?Django REST Framework技术求助
解决DRF中产品浏览次数存储与热门产品展示问题
嘿,刚接触DRF的话别担心,这个需求其实挺常见的,我来一步步帮你搞定~
1. 修改产品模型,添加浏览数字段
首先我们需要在你的Products模型里新增一个字段来存储浏览次数,推荐用PositiveIntegerField(因为浏览次数不可能是负数),默认值设为0就好。另外提一句,Django模型的命名规范一般用单数,比如Product而非Products,不过你如果习惯原来的命名也可以保留~
修改后的models.py代码示例:
from django.db import models from django.contrib.postgres.fields import ArrayModelField # 假设你用的是PostgreSQL的ArrayModelField class Category(models.Model): # 补全你的Category模型字段,比如分类名称 name = models.CharField(max_length=50) class CategoryForm(forms.ModelForm): class Meta: model = Category fields = ['name'] class Specifications(models.Model): # 补全你的Specifications模型字段,比如参数键值对 key = models.CharField(max_length=50) value = models.CharField(max_length=100) class Products(models.Model): name = models.CharField(max_length=100) image = models.CharField(max_length=10, null=True) categories = ArrayModelField( model_container=Category, model_form_class=CategoryForm ) specifications = ArrayModelField( model_container=Specifications, # 补全对应的表单类,比如SpecificationsForm ) # 新增浏览数字段 views = models.PositiveIntegerField(default=0) def __str__(self): return self.name
修改完模型后,别忘了执行数据库迁移命令:
python manage.py makemigrations python manage.py migrate
2. 处理浏览次数的递增逻辑
接下来要实现“用户访问产品详情时,浏览次数+1”的逻辑。这里推荐用Django的F()表达式来更新字段,它能直接在数据库层面操作,避免多请求同时访问时的竞态问题(比如两个请求同时读取到相同的views值,最后只加了1次的情况)。
我们可以用DRF的APIView自定义视图来实现:
from django.db.models import F from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Products from .serializers import ProductSerializer class ProductDetailView(APIView): def get(self, request, pk): try: product = Products.objects.get(pk=pk) # 用F表达式递增浏览次数,直接在数据库层面操作 Products.objects.filter(pk=pk).update(views=F('views') + 1) # 重新获取更新后的产品实例 product.refresh_from_db() serializer = ProductSerializer(product) return Response(serializer.data) except Products.DoesNotExist: return Response({"error": "Product not found"}, status=status.HTTP_404_NOT_FOUND)
3. 编写序列化器
把views字段添加到序列化器里,这样前端就能拿到浏览次数数据了:
from rest_framework import serializers from .models import Products class ProductSerializer(serializers.ModelSerializer): class Meta: model = Products fields = ['id', 'name', 'image', 'categories', 'specifications', 'views'] # 包含新增的views字段
4. 实现热门产品展示接口
要展示最受浏览的产品,只需要把产品按views字段降序排列,取前N个(比如前10个)即可。用DRF的ListAPIView就能轻松实现:
from rest_framework.generics import ListAPIView from .models import Products from .serializers import ProductSerializer class PopularProductsView(ListAPIView): # 按浏览次数降序排列,取前10个热门产品 queryset = Products.objects.order_by('-views')[:10] serializer_class = ProductSerializer
最后别忘了在urls.py里给这两个视图配置路由:
from django.urls import path from .views import ProductDetailView, PopularProductsView urlpatterns = [ path('products/<int:pk>/', ProductDetailView.as_view(), name='product-detail'), path('products/popular/', PopularProductsView.as_view(), name='popular-products'), ]
这样前端就可以通过/products/popular/接口获取浏览量最高的产品列表,通过产品详情接口自动累加浏览次数啦~
内容的提问来源于stack exchange,提问作者Sudharsan Venkatraj
相关产品推荐
相关产品推荐

