首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django django-activity-stream sql "data“列不存在?

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

Stack Overflow用户
提问于 2013-05-26 00:10:02
回答 2查看 846关注 0票数 0

我使用的是带有https://github.com/justquick/django-activity-stream的django 1.5。我做了一个action.send,比如

代码语言:javascript
复制
action.send(request.user, verb="wrote", action_object=Message, target=Group)

得到了这个错误。以下是postgres日志:

代码语言:javascript
复制
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"

我相信代码会执行以下代码:

代码语言:javascript
复制
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()

操作模型:

代码语言:javascript
复制
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表中,如何防止这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-26 00:14:28

看起来你在Action模型中缺少一个"data“字段。

或者--如果你不想这样,你需要删除这个:

代码语言:javascript
复制
  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中遗漏的内容

代码语言:javascript
复制
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')
票数 0
EN

Stack Overflow用户

发布于 2016-06-14 15:57:19

您可以删除该行

'USE_JSONFIELD':True

在您指定了ACTSTREAM_SETTINGS的settings.py中。

代码语言:javascript
复制
ACTSTREAM_SETTINGS = {
    # remove this
    'USE_JSONFIELD': True,
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16751430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档