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

Django按互动量排序图片动态流及实时显示互动数求助

Django动态流:互动数实时显示与热门排序实现

问题1:实时显示所有帖子的互动数

当前你通过手动点击按钮更新engagement_count字段,导致未点击过的帖子无法显示实时互动数。最优方案是不将互动数存储为数据库字段,而是通过模型属性实时计算:

修改models.py

删除原有的engagement_count字段,添加动态计算的属性:

class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    user = models.CharField(max_length=100)
    image = models.ImageField(upload_to='post_images')
    caption = models.TextField(max_length=100)
    created_at = models.DateTimeField(default=datetime.now)
    number_of_likes = models.IntegerField(default=0)
    number_of_dislikes = models.IntegerField(default=0)

    # 实时计算互动数(点赞+点踩)
    @property
    def engagement_count(self):
        return self.number_of_likes + self.number_of_dislikes

    def __str__(self):
        return self.user

清理冗余代码

  • 删除urls.py中的path('engagement-post', views.engagement_post, name='engagement-post'),
  • 删除views.py中的engagement_post函数
  • 模板中移除互动数更新按钮,直接显示计算结果:
<!-- 替换原有的engagement-post按钮代码 -->
<div class="flex items-center space-x-2">
    <div class="p-2 rounded-full text-black">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="25" height="25" class="">
            <path d="M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z" />
        </svg>
        {% if post.engagement_count == 0 %}
        <p>暂无互动</p>
        {% else%}
        <p>{{ post.engagement_count}} 次互动</p>
        {% endif %}
    </div>
</div>

所有帖子的互动数会实时计算显示,无需手动触发更新。

问题2:按互动量从高到低排序

在视图中通过数据库注解(annotate)计算互动数,然后按该值降序排序,效率远高于Python层面排序:

修改views.py的index函数

from django.db.models import F

def index(request):
    # 注解计算互动数,按互动数降序排列
    posts = Post.objects.annotate(
        total_engagement=F('number_of_likes') + F('number_of_dislikes')
    ).order_by('-total_engagement')
    return render(request, 'index.html', {'posts': posts})

额外优化:避免重复点赞/点踩

当前逻辑允许用户重复点赞,可添加检查逻辑防止重复操作:

# 修改like_post函数
def like_post(request):
    username = request.user.username
    post_id = request.GET.get('post_id')
    post = Post.objects.get(id=post_id)
    
    # 检查用户是否已点赞
    if not LikePost.objects.filter(post_id=post_id, username=username).exists():
        LikePost.objects.create(post_id=post_id, username=username)
        post.number_of_likes += 1
        post.save()
    return redirect('/')

# 修改dislike_post函数
def dislike_post(request):
    username = request.user.username
    post_id = request.GET.get('post_id')
    post = Post.objects.get(id=post_id)
    
    # 检查用户是否已点踩
    if not DislikePost.objects.filter(post_id=post_id, username=username).exists():
        DislikePost.objects.create(post_id=post_id, username=username)
        post.number_of_dislikes += 1
        post.save()
    return redirect('/')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:40:55