已经使用不同的查询集看到了查找

问题描述 投票:0回答:1

我按

ajax request
对学分列表进行排序。 第一次一切顺利,我得到了排序的学分列表和
update the cache
。但是当我尝试再次排序时,出现错误。

“credit payments”查找已在不同的查询集中出现。您可能需要调整查找的顺序。

如果缓存不更新,那么就不会报错。但我需要更新...

型号

class Credit(models.Model): pass class CreditPayment(models.Model): credit = models.ForeignKey(Credit, on_delete=models.CASCADE, related_name='creditpayments') rate = models.DecimalField(_('rate'), max_digits=7, decimal_places=2)

浏览量

class SortedCreditsList(ListView): def get(self, *args, **kwargs): if self.request.is_ajax(): credits = cache.get('credits') prefetch = Prefetch('creditpayments', CreditPayment.objects.all()) credits = credits.prefetch_related(prefetch).annotate(min_rate=Min('creditpayments__rate')) credits = credits.order_by('min_rate') cache.set('credits', credits) credits = credits.filter(best=False, hot=False) template_ajax = render_to_string( template_name='credits/includes/credits_filter_result.html', context={ 'credits': credits, }) return JsonResponse({'success': True, 'template': template_ajax})

追溯

ValueError at /sorted_kredit/ 'creditpayments' lookup was already seen with a different queryset. You may need to adjust the ordering of your lookups. Traceback: File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 149. response = self.process_exception_by_middleware(e, request) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 147. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/views/generic/base.py" in view 68. return self.dispatch(request, *args, **kwargs) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch 88. return handler(request, *args, **kwargs) File "/home/m0nte-cr1st0/work_projects/startup/finbee/credits/views.py" in get 555. cache.set('credits', credits) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/core/cache/backends/locmem.py" in set 75. pickled = pickle.dumps(value, pickle.HIGHEST_PROTOCOL) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/db/models/query.py" in __getstate__ 211. self._fetch_all() File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/db/models/query.py" in _fetch_all 1076. self._prefetch_related_objects() File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/db/models/query.py" in _prefetch_related_objects 656. prefetch_related_objects(self._result_cache, self._prefetch_related_lookups) File "/home/m0nte-cr1st0/.virtualenvs/finbee/local/lib/python2.7/site-packages/django/db/models/query.py" in prefetch_related_objects 1397. "You may need to adjust the ordering of your lookups." % lookup.prefetch_to)


django caching django-views
1个回答
3
投票

当您从缓存中获取

credits

值时,该对象已经预取。

if hasattr(cache, 'credits'): # Already Cached
    credits = cache.get('credits')

else:
    prefetch = Prefetch('creditpayments', CreditPayment.objects.all())
    credits = credits.prefetch_related(prefetch).annotate(min_rate=Min('creditpayments__rate'))
    credits = credits.order_by('min_rate')
    cache.set('credits', credits)

我认为这段代码可以让你的代码正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.