簡體   English   中英

為什么我的 Django rest 框架 api 返回一個空列表?

[英]Why is my Django rest framework api returning an empty list?

您好,我正在研究 Django Rest 框架 api,其中一個視圖返回一個空列表。

這是我的觀點:

@api_view(['GET'])
def post_search(request):
    form = SearchForm()
    query = None
    results = []
    if request.method == 'GET':
        if 'query' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                results = Paper.objects.annotate(
                    search=SearchVector('abstract', 'title'),).filter(search=query)
        serializer = PaperSerializer(results, many=True)

        return Response(serializer.data)

這是表格:

class SearchForm(forms.Form):
    query = forms.CharField()

這是我的網址:

path('search/', views.post_search, name='post_search'),

所以在 shell 上我跑了:

Paper.objects.annotate(search=SearchVector('abstract', 'title'),).filter(search='Type')

我得到了我想要的結果但是什么時候這樣做:

import requests
url = 'http://127.0.0.1:8000/api/search/?search=Type'
re = requests.get(url)
re.json # -> []
# or
import json
json.loads(re) # ->raise TypeError(f'the JSON object must be str, # bytes or bytearray, '
#TypeError: the JSON object must be str, bytes or bytearray, not Response

任何幫助將不勝感激; 謝謝

您的參數是search而不是query ,所以您檢查if 'search' in request.GET 但是你讓事情變得過於復雜。 您可以使用:

class SearchForm(forms.Form):
    search = forms.CharField()


@api_view(['GET'])
def post_search(request):
    form = SearchForm(request.GET)
    if form.is_valid():
        results = Paper.objects.annotate(
            search=SearchVector('abstract', 'title')
        ).filter(search=form.cleaned_data['search'])
        serializer = PaperSerializer(results, many=True)
        return Response(serializer.data)
    return Response({'error': 'invalid search'}, status=400)

問題是形式。

我的表格是:

class SearchForm(forms.Form):
    query = forms.CharField()

這里query的字段與 url 中的search不匹配。所以我所做的就是將表單更改為:

class SearchForm(forms.Form):
    search = forms.CharField()

經驗教訓:表單的字段需要與url中的關鍵字匹配。:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM