首页 > 解决方案 > Django 1.11.15 和查询字符串参数

问题描述

我正在尝试从 django 查询,即 http://localhost:8000/search/Tesco/apples以获取 json 列表的查询,如下所示。

[
    {
        "id": 12,
        "Date": "2018-08-02",
        "Title": "Rosedene Farms Small Sweet Apple 520G",
        "Price": 0.96,
        "PricePerWeight": "1.85/kg",
        "FinalOffer": "undefined undefined",
        "ProductID": 292249576
    },

我的 urls.py:

from django.conf.urls import url, include
from . import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register('Tesco', views.TescoView)

urlpatterns = [
    url('', include(router.urls), name='search'),
    url(r'^search/', include(router.urls), name='searchTwo')

我的意见.py

from __future__ import unicode_literals

from django.shortcuts import render
from rest_framework import viewsets
from .models import Tesco
from .serializers import TescoSerializers
from django.core.urlresolvers import reverse_lazy, reverse


class TescoView(viewsets.ModelViewSet):

    queryset = Tesco.objects.filter(Title__icontains='apple')
    serializer_class = TescoSerializers

如何获取 URL http://localhost:8000/search/tesco/以通过数据库查询 json 列表?

标签: django-rest-framework

解决方案


我不认为搜索像:

http://localhost:8000/search/Tesco/apples 

是 Django Rest Framework (DRF) 中的一种正常模式,所以我认为你会遇到很多阻力,试图让这种模式与 DRF 一起工作。如果我可以建议,我相信您处于XY 问题领域—— “也就是说,您正在尝试解决问题 X,并且您认为解决方案 Y 会起作用,但是当您遇到麻烦时,您不会询问 X,而是询问关于Y。”

通常,过滤参数在模型的列表视图中指定。对于您的模型,您可以在以下位置找到完整的 Tesco 实例列表:

http://localhost:8000/Tesco/

如果要对其进行过滤,请在?类似之后附加查询参数:

http://localhost:8000/Tesco/?title__icontains=apple

或者

http://localhost:8000/Tesco/?ProductID=292249576

或多个搜索过滤器,例如:

http://localhost:8000/Tesco/?ProductID=292249576&title__icontains=apple

要使用模式,您需要修改视图集并添加FilterSet。这就是您的 views.py 文件的样子:

from __future__ import unicode_literals

from django.shortcuts import render
from rest_framework import viewsets
from .models import Tesco
from .serializers import TescoSerializers
from django.core.urlresolvers import reverse_lazy, reverse
# Import filtering libraries
import django_filters 
from rest_framework import filters


class TescoFilterSet(django_filter.FilterSet):
    title__icontains = django_filter.Filter('Title', lookup_expr='icontains')
    class Meta:
        model = Tesco
        fields = ('title__icontains', 'ProductID')


class TescoView(viewsets.ModelViewSet):

    queryset = Tesco.objects.filter(Title__icontains='apple')
    serializer_class = TescoSerializers

    # Hook up filterset
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend, filters.OrderingFilter,)
    filter_class = TescoFilterSet

    # allow ordering on any field
    ordering_fields = '__all__'

根据我的经验,当您进行内容缓存时,nginx 和 apache 网络服务器似乎可以很好地使用这种模式。

有关过滤的更多信息,请参阅DRF 过滤指南。

订购

根据您的评论,您可以通过指定order_fields如上所示进行订购。然后你可以添加ordering参数。

                                                     vvvvvvvvvvvvvv    
 http://localhost:8000/Tesco/?title__icontains=apple&ordering=price

这将是上涨的价格。

添加一个-beforeprice并且顺序颠倒或降序:

 http://localhost:8000/Tesco/?title__icontains=apple&ordering=-price
                                                              ^

推荐阅读