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)})