如何在 curl 中使用 "where" 子句?
How to use "where" clause in curl?
我有一个 API 端点来获取用户添加的所有项目,它 returns 一个用户添加的所有对象的 JSONArray。
curl 127.0.0.1:8000/api/products/ -H "Authorization: Token xxxxxxxxx"
响应看起来像这样:
[{"url":"http://127.0.0.1:8000/api/products/18/","item_name":"ABC","barcode":"","item_price":5,"usr":"http://127.0.0.1:8000/auth/users/73/"},
{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"},...]
现在,我只想检索条码值为 123456 的对象,即 'item_name:PQR' 的对象。
因此,我尝试在 curl 中使用 'WHERE' 子句,如下所示:
curl 127.0.0.1:8000/api/products?barcode=123456 -H "Authorization: Token xxxxxxxxx"
我收到了 301 响应,而不是合适的对象。据我所知,3xx 范围内的响应代码意味着可以选择一个的多个响应。
解决此问题的解决方法是什么?
预期输出:
[{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"}]
(or)
{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"}
我为端点设置的模型视图:
class ProductViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = ProductModel.objects.all()
serializer_class = ProductSerializer
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
queryset = queryset.filter(usr=user)
return queryset
提前致谢。
HTTP 301 状态是永久移动重定向状态响应代码。
您的 url 可能以斜杠 ('/') 结尾,您没有在请求中添加它。 Django 有一个名为 APPEND_SLASH
的设置,如果您在设置的中间件列表中有 CommonMiddleware
,则默认情况下为 True
。此设置将您的请求重定向到附加的斜杠 url,在您的情况下会像这样:
curl 127.0.0.1:8000/api/products/?barcode=123456 -H "Authorization: Token xxxxxxxxx"
这就是您收到 301 的原因。请在 url 中添加斜线试试。
对于 REST API 中的 WHERE 子句,您必须确保已在您构建的 REST API 中添加过滤器。您可以通过检查传递的查询参数在视图的 get_queryset 方法中过滤查询集,或者,如果您使用的是 DRF,则可以使用 REST 框架提供的过滤器。
如果您正在使用 DRF,您可以通过 adding/updating 在您看来使用此方法来过滤查询集:
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
barcode = self.request.query_params.get('barcode', None)
if barcode:
queryset = queryset.filter(barcode=barcode)
queryset = queryset.filter(usr=user)
return queryset
或
def get_queryset(self):
filters = {}
filters['user'] = self.request.user
queryset = super().get_queryset()
barcode = self.request.query_params.get('barcode', None)
if barcode:
filters['barcode'] = barcode
queryset = queryset.filter(**filters)
return queryset
虽然这两个查询集的工作方式相同。
或者您可以通过将这些添加到视图中来在视图中使用过滤器:
from django_filters.rest_framework import DjangoFilterBackend
class ProductViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = ProductModel.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['barcode', ]
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
queryset = queryset.filter(usr=user)
return queryset
参考文献:
我有一个 API 端点来获取用户添加的所有项目,它 returns 一个用户添加的所有对象的 JSONArray。
curl 127.0.0.1:8000/api/products/ -H "Authorization: Token xxxxxxxxx"
响应看起来像这样:
[{"url":"http://127.0.0.1:8000/api/products/18/","item_name":"ABC","barcode":"","item_price":5,"usr":"http://127.0.0.1:8000/auth/users/73/"},
{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"},...]
现在,我只想检索条码值为 123456 的对象,即 'item_name:PQR' 的对象。 因此,我尝试在 curl 中使用 'WHERE' 子句,如下所示:
curl 127.0.0.1:8000/api/products?barcode=123456 -H "Authorization: Token xxxxxxxxx"
我收到了 301 响应,而不是合适的对象。据我所知,3xx 范围内的响应代码意味着可以选择一个的多个响应。 解决此问题的解决方法是什么? 预期输出:
[{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"}]
(or)
{"url":"http://127.0.0.1:8000/api/products/19/","item_name":"PQR","barcode":"123456","item_price":85,"usr":"http://127.0.0.1:8000/auth/users/73/"}
我为端点设置的模型视图:
class ProductViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = ProductModel.objects.all()
serializer_class = ProductSerializer
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
queryset = queryset.filter(usr=user)
return queryset
提前致谢。
HTTP 301 状态是永久移动重定向状态响应代码。
您的 url 可能以斜杠 ('/') 结尾,您没有在请求中添加它。 Django 有一个名为 APPEND_SLASH
的设置,如果您在设置的中间件列表中有 CommonMiddleware
,则默认情况下为 True
。此设置将您的请求重定向到附加的斜杠 url,在您的情况下会像这样:
curl 127.0.0.1:8000/api/products/?barcode=123456 -H "Authorization: Token xxxxxxxxx"
这就是您收到 301 的原因。请在 url 中添加斜线试试。
对于 REST API 中的 WHERE 子句,您必须确保已在您构建的 REST API 中添加过滤器。您可以通过检查传递的查询参数在视图的 get_queryset 方法中过滤查询集,或者,如果您使用的是 DRF,则可以使用 REST 框架提供的过滤器。
如果您正在使用 DRF,您可以通过 adding/updating 在您看来使用此方法来过滤查询集:
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
barcode = self.request.query_params.get('barcode', None)
if barcode:
queryset = queryset.filter(barcode=barcode)
queryset = queryset.filter(usr=user)
return queryset
或
def get_queryset(self):
filters = {}
filters['user'] = self.request.user
queryset = super().get_queryset()
barcode = self.request.query_params.get('barcode', None)
if barcode:
filters['barcode'] = barcode
queryset = queryset.filter(**filters)
return queryset
虽然这两个查询集的工作方式相同。
或者您可以通过将这些添加到视图中来在视图中使用过滤器:
from django_filters.rest_framework import DjangoFilterBackend
class ProductViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = ProductModel.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['barcode', ]
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
queryset = queryset.filter(usr=user)
return queryset
参考文献: