【问题标题】:Django mod_wsgi PicklingError while saving object保存对象时出现 Django mod_wsgi PicklingError
【发布时间】:2011-03-18 13:39:21
【问题描述】:

你知道解决办法吗:

[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162] mod_wsgi (pid=3072): Exception occurred processing WSGI script '/home/www/shop/django.wsgi'., referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162] Traceback (most recent call last):, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]   File "/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 245, in __call__, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]     response = middleware_method(request, response), referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]   File "/usr/lib/python2.5/site-packages/django/contrib/sessions/middleware.py", line 36, in process_response, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]     request.session.save(), referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]   File "/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/db.py", line 57, in save, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]     session_data = self.encode(self._get_session(no_load=must_create)),, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]   File "/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/base.py", line 88, in encode, referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162]     pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL), referer: http://shop.domain.com/accounts/checkout/?
[Thu Jul 08 19:15:38 2010] [error] [client 79.162.31.162] PicklingError: Can't pickle <class 'decimal.Decimal'>: it's not the same object as decimal.Decimal, referer: http://shop.domain.com/accounts/checkout/?

在使用 DecimalField 保存模型实例时有时会发生这种情况:/。

views.py:

def checkout_authenticated(request):
    order = get_order(request)
    user = request.user

    if request.method == 'POST':
        form = OrderCheckoutForm(request.POST, instance = order)
        if form.is_valid():
            form.save()
...

forms.py:

class OrderCheckoutForm(forms.ModelForm):
    class Meta:
        model = Order
        exclude = ('status',
                   'user')

models.py:

class Shipping(models.Model):
    name = models.CharField(max_length = 256)
    price = models.DecimalField(max_digits = 10, decimal_places = 2)
    description = models.TextField(blank = True, null = True)
    cash_on_delivery = models.BooleanField(default = False)

class Order(models.Model):
    date = models.DateField(editable = False, auto_now_add=True)
    status = models.CharField(max_length = 1, choices = STATUS, default = Status.NEW)

    shipping = models.ForeignKey(Shipping, related_name = 'orders', null = True)
    address = models.ForeignKey(Address, related_name = 'address_order', null = True)
    invoice = models.BooleanField(default = False)
    company = models.ForeignKey(Company, related_name = 'company_order', blank = True, null = True)

我认为原因是:

price = models.DecimalField(max_digits = 10, decimal_places = 2)

提前致谢, 埃塔姆。

【问题讨论】:

  • 我刚刚注意到 etam 在 7 月 8 日发布了一个相同的问题(具有相同的输出)。将这个问题作为副本关闭?
  • 我是在 serverfault.com 上做的...

标签: python django django-models pickle


【解决方案1】:

this answer。这有帮助吗?

编辑(回复您的评论):

恐怕我不了解 django 或您的代码,无法为您提供修复。不过,我确实对潜在错误有更清晰的认识:在此错误发生之前,创建了 decimal.Decimal 的实例,然后由于某种原因重新定义了类 decimal.Decimal。当 pickle 类无法通过名称定位给定对象的类定义时,它就不起作用了。

这是一个显示类似问题的解释器会话:

>>> import cPickle
>>> class Foo(object):
...     pass
... 
>>> f = Foo()
>>> s = cPickle.dumps(f)
>>>
>>> # Redefine class Foo 
>>> class Foo(object):
...     pass
... 
>>> # Now attempt to pickle the same object that was created with the old Foo class
>>> s = cPickle.dumps(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cPickle.PicklingError: Can't pickle <class '__main__.Foo'>: it's not the same object as __main__.Foo
>>>
>>> # Create an object with the new Foo class, and try to pickle it (this works)
>>> f2 = Foo()
>>> s = cPickle.dumps(f2)

【讨论】:

  • 不,我不知道该怎么办 :(.
  • 那么您需要提供更多信息。首先,请求是什么样的?
  • 查看我的编辑 -- 恐怕我现在能提供的就这些了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多