django-rest-framework - 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 列表?
解决方案
我不认为搜索像:
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
^
推荐阅读
- c# - 有没有办法为默认模型绑定错误构建自定义错误消息,想要摆脱消息中的行和位置
- python-3.x - 找到最小数量的笔记来赚一笔
- julia - 结构数组字段上的广播运算符(Julia)
- r - 当相对误差不断下降时,如何修剪和使用复杂度参数(cp)?
- python - 如何在 Keras 中实现 Salt&Pepper 层?
- angular - 如何使用带有 idphint 属性的 angular keycloak 配置?
- php - 在 php 页面中嵌入 javascript
- c++ - 用一对对排序 STL 容器
- css - CSS:缩放字体一个恒定的因素
- java - 为什么login_register在满足变量后不运行?