Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:Queryset不保存对值的更改?_Python_Django_Django Queryset - Fatal编程技术网

Python Django:Queryset不保存对值的更改?

Python Django:Queryset不保存对值的更改?,python,django,django-queryset,Python,Django,Django Queryset,这里,result是一个查询集。我正在检查它并更新它的price属性的值,以匹配我在对Product.objects的第二次查询中从price\u map.price值中得到的值 这将起作用并相应地更新价格。直到它进入.order\u by方法。然后,price的所有值返回到原来的状态 if sort_by in valid_sorts: for item in result: retrieved_item = Product.object

这里,
result
是一个查询集。我正在检查它并更新它的
price
属性的值,以匹配我在对
Product.objects的第二次查询中从
price\u map.price
值中得到的值

这将起作用并相应地更新价格。直到它进入
.order\u by
方法。然后,
price
的所有值返回到原来的状态

if sort_by in valid_sorts:
            for item in result:
                retrieved_item = Product.objects.get(name=item.name).get_pricing_info(self.request.session.get('visitors_country'))
                if retrieved_item['price_map'] is None:
                    print 'we got a none here! ', item.name
                else:
                    item.price = retrieved_item['price_map'].price

            if sort_by == 'highlow':
                result = result.order_by('-price')
            elif sort_by == 'lowhigh':
                result = result.order_by('price')
            elif sort_by == 'newest':
                result = result.order_by('-date','-price')
            elif sort_by == 'relevancy':
                pass
如果我在
.order\u by
调用之前和之后添加一些print语句,我得到的输出如下:

Just before the order!
79.99
119.99
99.99
69.99
119.99
89.99
69.99
69.99
99.99
44.99
599.99
599.99
69.99
69.99
69.99
69.99
249.99
799.99
119.99
139.99
199.99
249.99
139.99
149.99
139.99
69.99
139.99
199.99
69.99
29.99
0.0
139.99
34.99
54.99
119.99
149.99
69.99
69.99
89.99
119.99
119.99
149.99
149.99
1699.99
69.99
249.99
39.99
39.99
39.99
599.99
999.99
199.99
49.99
119.99
119.99
249.99
99.99
99.99
199.99
69.99
99.99
39.99
169.99
this is the high low sort!
1499.99
599.99
599.99
399.99
349.99
299.99
249.99
209.99
199.99
199.99
179.99
159.99
159.99
129.99
129.99
119.99
119.99
119.99
119.99
119.99
99.99
99.99
89.99
89.99
89.99
69.99
69.99
69.99
69.99
59.99
59.99
49.99
49.99
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
更改for循环中的价格值后尝试保存项目时问题的堆栈跟踪:

Traceback (most recent call last):
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/haystack/generic_views.py", line 120, in get
    form = self.get_form(form_class)
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 45, in get_form
    return form_class(**self.get_form_kwargs())
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/haystack/generic_views.py", line 94, in get_form_kwargs
    kwargs = super(FacetedSearchMixin, self).get_form_kwargs()
  File "/home/user/.virtualenvs/rf/local/lib/python2.7/site-packages/haystack/generic_views.py", line 65, in get_form_kwargs
    kwargs.update({'searchqueryset': self.get_queryset()})
  File "/home/user/Documents/sandbox/opt/rock/ro/rf/products/views.py", line 344, in get_queryset
    item.save()
TypeError: 'NoneType' object is not callable

order\u by
函数返回一个新的queryset实例。由于queryset的惰性,新的
结果
queryset(带有
order\u by
)将执行另一个查询以从数据库中获取数据

由于您没有保存更新的项,因此该值只是在python对象级别更新,而不是保存在数据库中。因此,当您使用新的
result
queryset访问
price
时,它会显示从数据库中获取的结果,该数据库仍然是旧数据库


因此,要解决这个问题,可以在python级别对对象进行排序,或者在调用
order\u by
函数之前保存项目。

是否在更新price后保存项目实例
item.save()
?我尝试添加
item.save
,但出现一个错误
NoneType对象不可调用。
我明白我明白了。谢谢你提供的关于如何工作的信息。有没有一种好方法可以对Searchqueryset对象进行排序而不将其转换为列表?其余的代码取决于这是一个SQS对象。您可以使用
order\u by
方法对任何查询集进行排序。它将在数据库级别对数据进行排序(在将结果缓存到
\u result\u cache
列表中之前)。但是在您的例子中,在获取结果之后,您正在更改单个对象的值。因此,如果您不想再次保存结果,那么必须在python级别进行保存。我明白了。你知道为什么
item.save()
会给我一个错误吗?它说的是
NoneType对象是不可调用的
…但是,据我所知,我调用的
.save()
对象中没有一个是非类型的(否则它们会被捕获在我的
语句中,如果:
并且当我打印出每个项的类型时,没有一个是
NoneType
)。添加问题中错误的堆栈跟踪。我认为
对象不是
,因为在这种情况下,错误将是
'NoneType'对象没有属性“save”
。所以可能在save方法的某个地方,它试图调用
NoneType
对象。您可以使用python调试器
pdb
ipdb
来获取每个步骤的执行细节。从堆栈跟踪中无法得出太多结论。尝试使用
ipdb
。它会给你提供很好的细节。另一方面,您是否希望保存
对象,因为它看起来像是根据每个用户请求的国家/地区进行查询。因此,如果您正在保存,
项目
价格将使用当前用户的国家/地区在数据库中不断变化。