EncodeError:' QuerySet'对象没有属性' _prefetch_related_lookups'

时间:2015-01-28 12:56:57

标签: python django django-queryset

我最近将我的django版本从1.2.5更新为1.7。完成后,我的应用程序上的所有新事务都按预期工作。但是每当我尝试访问一个pickle对象时,我都会收到错误

EncodeError: 'QuerySet' object has no attribute '_prefetch_related_lookups'

这是抛出的错误

'QuerySet' object has no attribute '_prefetch_related_lookups'
Traceback (most recent call last):
  File "/foo/bar/gateway/baseGateway.py", line 108, in queueMessage
    eng.processMessage(msgRow)
  File "/foo/bar/engine/processor.py", line 101, in processMessage
    tasks.deliverMessage.apply_async(args=[foo, bar], queue='message-deliver')
  File "/opt/bitnami/python/lib/python2.7/site-packages/celery/app/task.py", line 555, in apply_async
    **dict(self._get_exec_options(), **options)
  File "/opt/bitnami/python/lib/python2.7/site-packages/celery/app/base.py", line 353, in send_task
    reply_to=reply_to or self.oid, **options
  File "/opt/bitnami/python/lib/python2.7/site-packages/celery/app/amqp.py", line 305, in publish_task
    **kwargs
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/messaging.py", line 161, in publish
    compression, headers)
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/messaging.py", line 237, in _prepare
    body) = dumps(body, serializer=serializer)
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/serialization.py", line 164, in dumps
    payload = encoder(data)
  File "/opt/bitnami/python/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/serialization.py", line 59, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/serialization.py", line 55, in _reraise_errors
    yield
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/serialization.py", line 164, in dumps
    payload = encoder(data)
  File "/opt/bitnami/python/lib/python2.7/site-packages/kombu/serialization.py", line 356, in pickle_dumps
    return dumper(obj, protocol=pickle_protocol)
  File "/opt/bitnami/python/lib/python2.7/site-packages/django/db/models/query.py", line 113, in __reduce__
    return super(QuerySet, self).__reduce__()
  File "/opt/bitnami/python/lib/python2.7/copy_reg.py", line 84, in _reduce_ex
    dict = getstate()
  File "/opt/bitnami/python/lib/python2.7/site-packages/django/db/models/query.py", line 91, in __getstate__
    self._fetch_all()
  File "/opt/bitnami/python/lib/python2.7/site-packages/django/db/models/query.py", line 967, in _fetch_all
    if self._prefetch_related_lookups and not self._prefetch_done:
EncodeError: 'QuerySet' object has no attribute '_prefetch_related_lookups'

看一下在线和django herehere提供的一些解决方案,我清除了django中的会话表无济于事。错误仍然存​​在。我也在我的应用程序中使用memcache而且我清除了它。我也用芹菜。

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

谷歌搜索给我们一个结果

重置会话应用修复了此问题(至少暂时...) https://code.djangoproject.com/ticket/18674

问题是Sessions,我必须删除所有才能使它工作。另外我更改了设置SECRET_KEY,因此所有会话都不会验证。

http://jj.isgeek.net/2013/04/django-queryset-object-has-no-attribute-_prefetch_related_lookups/

答案 1 :(得分:0)

你有来自Django的一些序列化数据< 1.4,Kombu试图在你当前的Django版本中反序列化它。

我不知道Kombu在哪里保存其序列化数据,但这就是你应该看的地方。您应该删除陈旧数据,或者如果您需要保留数据,请手动更改它以匹配您当前的Django版本。

答案 2 :(得分:0)

我在尝试更改视图中模型表单上的查询集时遇到了相关问题。错误是:

'NoneType' object has no attribute '_prefetch_related_lookups'

forms.py

class S1Form(forms.ModelForm):
  library = forms.ModelChoiceField(
    queryset = Library.objects.all(),
    to_field_name = 'title',
    required = True,
    widget = forms.Select(
      attrs = {
        'class': 'custom-select'}
    ),
    disabled = False,
    empty_label = 'Select a library'
  )

views.py

class FilteredSpectraSearchListView(SingleTableMixin, FilterView):
  ...
  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['sform'] = S1Form()
    context['sform'].fields['library'].queryset = None
    if <something>:
      context['sform'].fields['library'].queryset = <...>
    elif <something-else>:
      context['sform'].fields['library'].queryset = <...>
    return context

目标是最初有一个空的查询集,后来根据一些条件语句进行更改。问题是条件 "<something>" 没有触发,None 仍然是查询集。对于这种情况,解决方案只是提供一个空的查询集而不是 None

    ...
    context['sform'].fields['library'].queryset = Library.objects.none()
    if <something>:
      context['sform'].fields['library'].queryset = <...>
    elif <something-else>:
      context['sform'].fields['library'].queryset = <...>
    ...
相关问题