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

如何统计并展示最受浏览产品?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:56