You need to enable JavaScript to run this app. Django开发的视频点赞触发通知系统不生效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Django开发的视频点赞触发通知系统不生效问题求助

点赞通知功能失效问题排查与修复

核心故障点

  • 信号完全未触发:编写的两个点赞通知处理函数仅作为Video类的内部方法存在,既没有通过装饰器绑定对应信号,也没有在应用配置的ready()方法中完成注册,函数永远不会被系统调用。
  • 信号类型匹配错误:视频点赞操作本质是对Video.likes多对多关联表做增删操作,对应的触发信号是m2m_changed,而非Video模型自身的保存/删除信号,即使函数绑定了也无法捕捉到点赞动作。
  • 参数取值逻辑错误:
    • 原代码中like = instance.likes实际取到的是Video实例关联的用户管理器,而非具体执行点赞的用户;后续sender = like.account更是错误地从管理器对象上取不存在的account属性。
    • 取消点赞的逻辑中使用video = object.self属于无效Python语法,根本无法获取被操作的视频对象。
  • 通知删除逻辑失效:原代码临时实例化了一个未入库的Notification对象就直接调用delete()操作,完全不会命中数据库中真实存在的点赞通知记录。
  • 字段定义错误:likes多对多字段添加了default=None参数,多对多关系字段不支持设置默认值,会直接触发迁移报错。
  • 代码结构不合理:将信号处理函数定义在Video模型类内部,既会导致跨模型导入循环依赖,类内部的普通方法也无法直接作为信号接收器使用。

可运行的修复方案

  1. 单独拆分信号模块(避免跨模型循环导入),在videos/signals.py中编写绑定好的信号逻辑:
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from .models import Video
from accounts.models import Account
from notifications.models import Notification

@receiver(m2m_changed, sender=Video.likes.through)
def handle_video_like_change(sender, instance, action, pk_set, **kwargs):
    # 仅处理点赞/取消点赞完成后的动作,避免重复生成通知
    if action not in ["post_add", "post_remove"]:
        return
    # 获取本次操作涉及的所有点赞用户
    like_users = Account.objects.filter(pk__in=pk_set)
    for user in like_users:
        if action == "post_add":
            # 查重避免重复生成通知
            Notification.objects.get_or_create(
                video=instance,
                sender=user,
                user=instance.author,
                notification_type=1
            )
        if action == "post_remove":
            # 精准匹配删除对应通知
            Notification.objects.filter(
                video=instance,
                sender=user,
                user=instance.author,
                notification_type=1
            ).delete()
  1. 在应用配置中加载信号逻辑,修改videos/apps.py:
from django.apps import AppConfig

class VideosConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'videos'

    def ready(self):
        # 导入信号模块完成注册
        from . import signals
  1. 修正Video模型的likes字段定义,移除不支持的default=None参数:
likes = models.ManyToManyField(Account, blank=True, related_name='likes')
  1. 原有通知展示视图的查询、渲染逻辑无问题,可正常保留使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 05:54:07