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

使用django-activity-stream时遇'property'无'_meta'属性错误

Django Activity Stream 无法指定User为活动发起者的解决方案

问题核心

你错误地将User类或类属性传递给action.send(),但该方法的第一个参数要求传入具体的用户实例,而非类本身。在admin后台创建团队时,需要获取当前执行创建操作的用户实例,再传递给action.send()。

错误原因解析

  • 传递User类:action.send()会将其当作模型实例处理,读取id时拿到的是类的id属性(property对象),而非具体用户的ID值,因此报错Field 'id' expected a number but got '<property object...>'。
  • 传递User.pk:User.pk是类的属性(property类型),既不是模型实例也不是合法的用户ID,actstream无法识别对应的ContentType,因此报错'property' object has no attribute '_meta'。

解决方案

方法1:在Admin类中直接处理(推荐)

通过admin后台创建团队时,直接在Team的Admin类里重写save_model方法,这里能直接获取request.user,无需依赖信号:

# apps/teams/admin.py
from django.contrib import admin
from .models import Team
from actstream import action

@admin.register(Team)
class TeamAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # 先保存团队实例
        super().save_model(request, obj, form, change)
        # 仅在创建新团队时记录活动流
        if not change:
            action.send(request.user, verb="创建了团队", target=obj)

方法2:修改信号传递用户实例

如果必须使用post_save信号,可在admin保存时给实例添加临时属性传递用户:

  1. 修改Team的Admin类:
# apps/teams/admin.py
from django.contrib import admin
from .models import Team

@admin.register(Team)
class TeamAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # 添加临时属性存储创建者用户
        obj._created_by = request.user
        super().save_model(request, obj, form, change)
  1. 修改signals.py:
# apps/custom_admin/signals.py
from actstream import action
from django.db.models.signals import post_save
from django.dispatch import receiver
from apps.teams.models import Team

@receiver(post_save, sender=Team)
def track_team_created(sender, instance, created, **kwargs):
    if created and hasattr(instance, '_created_by'):
        action.send(instance._created_by, verb="创建了团队", target=instance)
        del instance._created_by  # 清理临时属性
        print("创建团队的活动已记录")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:50