Django django-activity-stream sql“data”列不存在?

时间:2013-05-25 16:10:02

标签: python django

我正在使用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表中,如何防止这种情况?

2 个答案:

答案 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')