Python 一旦切片被提取到django,就无法筛选查询
跟进: 有关: 我不需要过滤对象,只需按日期排序并选择最近的一个:Python 一旦切片被提取到django,就无法筛选查询,python,python-3.x,django,Python,Python 3.x,Django,跟进: 有关: 我不需要过滤对象,只需按日期排序并选择最近的一个: def get_latest_currency(self): """ Return most up to date value """ up_to_date_currency = Currency.objects.order_by('-currency_value_in_dollars_date')[:1] if not up_
def get_latest_currency(self):
"""
Return most up to date value
"""
up_to_date_currency = Currency.objects.order_by('-currency_value_in_dollars_date')[:1]
if not up_to_date_currency.exists():
# No objects yet; fetch currencies
update_coins_table()
return Currency.objects.order_by('-currency_value_in_dollars_date')[:1]
最新货币已正确初始化;最后一行给出:
assert not self.query.is_sliced, \
AssertionError: Cannot filter a query once a slice has been taken.
这段代码表示一个视图,我想返回一个普通的JSON对象,这是一个REST端点。为什么django抱怨只使用了一个片段的过滤器
get_latest_currency是终结点的名称:
import sys
from django.urls import path
from . import views
app_name = 'manage_crypto_currency'
urlpatterns = [
path('get_currency/', views.get_latest_currency, name='index'),
]
堆栈跟踪:
Internal Server Error: /get_currency/
Traceback (most recent call last):
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\utils\deprecation.py", line 116, in __call__
response = self.process_response(request, response)
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\middleware\clickjacking.py", line 26, in process_response
if response.get('X-Frame-Options') is not None:
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\db\models\query.py", line 418, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\db\models\query.py", line 942, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\projects\crypto-currency-board\venv\lib\site-packages\django\db\models\query.py", line 954, in _filter_or_exclude
assert not self.query.is_sliced, \
AssertionError: Cannot filter a query once a slice has been taken.
尝试围绕HttpReporte包装对象:
返回HttpResponseCurrency.objects.order_by'-currency_value_in_$s_date'[:1],content_type='application'
“/json”
这是可行的,但由于某种原因,只返回了名称。您返回的查询集是视图的结果,但视图不能返回查询集。中间件的目的是将其转换为HTTP响应,从而产生错误
因此,您的观点需要返回一些。一个非常简单的回答是QuerySet的str.:
当然,您可以返回更复杂的结果,例如通过呈现模板或返回序列化程序的结果
例如,如果要序列化最后一个对象,可以使用:
from django.http import JsonResponse
from django.core.serializers import serialize
from json import loads as jloads
def get_latest_currency(self):
up_to_date_currency = Currency.objects.order_by('-currency_value_in_dollars_date')[:1]
if not up_to_date_currency.exists():
# No objects yet; fetch currencies
update_coins_table()
cr = Currency.objects.latest('-currency_value_in_dollars_date')
data = serialize('json', [cr])
return JsonResponse({'data' : jloads(data)})
你在哪里使用最新的货币?看起来你在过滤“获取最新货币”的结果。你能显示完整的ltraceback吗?@Williem这是一个view@Dmitry添加了StackTrace问题是您将此函数用作视图,但视图应返回HttpResponse。当使用strquery_结果时,我得到的结果。@Sebi:是的,没错,但问题是,您不能返回查询集作为视图的结果。HTTP响应始终是文本,因此您可以将其序列化为JSON blob等,但不能返回QuerySet、模型对象等@Sebi:您可以使用JsonResponse和Django serialize对数据进行JSON序列化。
from django.http import JsonResponse
from django.core.serializers import serialize
from json import loads as jloads
def get_latest_currency(self):
up_to_date_currency = Currency.objects.order_by('-currency_value_in_dollars_date')[:1]
if not up_to_date_currency.exists():
# No objects yet; fetch currencies
update_coins_table()
cr = Currency.objects.latest('-currency_value_in_dollars_date')
data = serialize('json', [cr])
return JsonResponse({'data' : jloads(data)})