gpt4 book ai didi

python - Django swagger-如何从删除、放置方法中禁用 DjangoFilterBackend 查询过滤器?

转载 作者:太空狗 更新时间:2023-10-29 17:33:35 25 4
gpt4 key购买 nike

我创建了一个 AssetsFilter 类:

from django_filters import Filter
from django_filters import rest_framework as filters
from django_filters.fields import Lookup

from .models import Assets


class MyListFilter(Filter):
def filter(self, qs, value):
value_list = value.split(',')
return super(ListFilter, self).filter(qs, Lookup(value_list, 'in'))


class AssetsFilter(filters.FilterSet):
name = filters.CharFilter(lookup_expr='icontains', help_text=u'Filter by name')
criticality = MyListFilter(name='critical', help_text=u'Filter by_id')

class Meta:
model = Assets
fields = ['name', 'criticality ']

现在我在我的 View 集中使用这个过滤器,如下所示:

from .serializers import AssetSerializers
from .filters import AssetsFilter


class AssetViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Assets.objects.all()
serializer_class = AssetSerializers
filter_backends = (DjangoFilterBackend,)
filter_class = AssetsFilter
http_method_names = ['get', 'post', 'put', 'delete']

def list(self, request):
"""
Returns a list of Asset.
"""
return super(AssetViewSet, self).list(request)

def create(self, request):
"""
Creates a new Asset.<br>
"""
return super(AssetViewSet, self).create(request)

def destroy(self, request, pk=None):
"""
Deletes a Asset.
"""
return super(AssetViewSet, self).destroy(request, pk=pk)

def retrieve(self, request, pk=None):
"""
Returns a Asset with id={id}
"""
return super(AssetViewSet, self).retrieve(request, pk=pk)

def update(self, request, pk=None, *args, **kwargs):
"""
Updates an existing Asset.<br>
"""
return super(AssetViewSet, self).update(request, pk=pk, *args, **kwargs)

创建swagger文档时,过滤字段出现在GET(list)中,GET(retrieve)如预期,但它们也出现在中POSTPUTPATCHDELETE 不应该出现的位置。

如何禁止这些参数出现在最新版本的 django-rest-swagger 和 DRF 中?

最佳答案

如果您不想(每次)手动添加架构,那么解决方案如下:auto_schema.py

from rest_framework.schemas import AutoSchema
from django.utils.six.moves.urllib import parse as urlparse
import coreapi, coreschema


class CustomSchema(AutoSchema):
def get_link(self, path, method, base_url):
fields = self.get_path_fields(path, method)
fields += self.get_serializer_fields(path, method)
fields += self.get_pagination_fields(path, method)
if self.view.action in ['list']:
fields += self.get_filter_fields(path, method)

manual_fields = self.get_manual_fields(path, method)
fields = self.update_fields(fields, manual_fields)

if fields and any([field.location in ('form', 'body') for field in fields]):
encoding = self.get_encoding(path, method)
else:
encoding = None

description = self.get_description(path, method)

if base_url and path.startswith('/'):
path = path[1:]

return coreapi.Link(
url=urlparse.urljoin(base_url, path),
action=method.lower(),
encoding=encoding,
fields=fields,
description=description
)

View .py

class MyUserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.

"""
model = MyUser
serializer_class = MyUserSerializer
queryset = MyUser.objects.all()
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_class = MyUserFilter
ordering_fields = ('last_name', 'first_name', 'email', 'is_active')
ordering = ('last_name', 'first_name')
permission_classes = (IsAuthenticated,)
schema = CustomSchema()

关于python - Django swagger-如何从删除、放置方法中禁用 DjangoFilterBackend 查询过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48007965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com