我正在使用django 1.5和https://github.com/justquick/django-activity-stream。我做了一个action.send就像
action.send(request.user, verb="wrote", action_object=Message, target=Group)
并收到此错误。这是postgres日志:
2013-05-25 08:51:46 PDT ERROR: column "data" of relation "actstream_action"
does not exist at character 229
2013-05-25 08:51:46 PDT STATEMENT: INSERT INTO "actstream_action"
("actor_content_type_id", "actor_object_id", "verb", "description",
"target_content_type_id", "target_object_id", "action_object_content_type_id",
"action_object_object_id", "timestamp", "public", "data") VALUES (9, '2', 'wrote', NULL,
14, '<property object at 0x25be3c0>', 22, '<property object at 0x25be3c0>', '2013-05-25
15:51:46.693503+00:00', true, NULL) RETURNING "actstream_action"."id"
我相信代码会执行此操作:
def action_handler(verb, **kwargs):
"""
Handler function to create Action instance upon action signal call.
"""
from actstream.models import Action
kwargs.pop('signal', None)
actor = kwargs.pop('sender')
check_actionable_model(actor)
newaction = Action(
actor_content_type=ContentType.objects.get_for_model(actor),
actor_object_id=actor.pk,
verb=unicode(verb),
public=bool(kwargs.pop('public', True)),
description=kwargs.pop('description', None),
timestamp=kwargs.pop('timestamp', now())
)
for opt in ('target', 'action_object'):
obj = kwargs.pop(opt, None)
if not obj is None:
check_actionable_model(obj)
setattr(newaction, '%s_object_id' % opt, obj.pk)
setattr(newaction, '%s_content_type' % opt,
ContentType.objects.get_for_model(obj))
if settings.USE_JSONFIELD and len(kwargs):
newaction.data = kwargs
newaction.save()
行动模式:
class Action(models.Model):
actor_content_type = models.ForeignKey(ContentType, related_name='actor')
actor_object_id = models.CharField(max_length=255)
actor = generic.GenericForeignKey('actor_content_type', 'actor_object_id')
verb = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
target_content_type = models.ForeignKey(ContentType, related_name='target',
blank=True, null=True)
target_object_id = models.CharField(max_length=255, blank=True, null=True)
target = generic.GenericForeignKey('target_content_type',
'target_object_id')
action_object_content_type = models.ForeignKey(ContentType,
related_name='action_object', blank=True, null=True)
action_object_object_id = models.CharField(max_length=255, blank=True,
null=True)
action_object = generic.GenericForeignKey('action_object_content_type',
'action_object_object_id')
timestamp = models.DateTimeField(default=now)
public = models.BooleanField(default=True)
# below in models.py
if actstream_settings.USE_JSONFIELD:
try:
from jsonfield.fields import JSONField
except ImportError:
raise ImproperlyConfigured('You must have django-jsonfield installed '
'if you wish to use a JSONField on your actions')
JSONField(blank=True, null=True).contribute_to_class(Action, 'data')
所以在action_handler中,它有newaction.data = kwargs。为什么数据属性会保存到db表中,如何防止这种情况?
答案 0 :(得分:1)
您可以删除该行
'USE_JSONFIELD':True
在您指定了ACTSTREAM_SETTINGS的settings.py中。
ACTSTREAM_SETTINGS = {
# remove this
'USE_JSONFIELD': True,
}
答案 1 :(得分:0)
您似乎错过了Action模型中的“数据”字段。
或者 - 如果您不想这样,您需要删除它:
if settings.USE_JSONFIELD and len(kwargs):
newaction.data = kwargs
为什么不从https://github.com/bradjasper/django-jsonfield(或其他地方)创建一个JSONField的数据字段?
这是您遗失的内容,来自https://github.com/justquick/django-activity-stream/blob/master/actstream/models.py
if actstream_settings.USE_JSONFIELD:
try:
from jsonfield.fields import JSONField
except ImportError:
raise ImproperlyConfigured('You must have django-jsonfield installed '
'if you wish to use a JSONField on your actions')
JSONField(blank=True, null=True).contribute_to_class(Action, 'data')