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
。它会给你提供很好的细节。另一方面,您是否希望保存项
对象,因为它看起来像是根据每个用户请求的国家/地区进行查询。因此,如果您正在保存,项目
价格将使用当前用户的国家/地区在数据库中不断变化。