如何解决如何配置viewsets.ModelViewSet以使用在请求正文中传递的参数进行过滤 Django Rest Framework
我正在使用DJANGO-REST-FRAMEWORK构建API。我正在尝试使用传递给请求主体的参数来过滤后端,这是我的设置:
views.py
from .models import UsstatesG
from .serializer import UsstatesSerializer
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
class StatesViewSet(viewsets.ModelViewSet):
queryset = UsstatesG.objects.all()
serializer_class = UsstatesSerializer
@action(detail=False)
def get_by_id(self,request):
body = request.body.decode('utf-8')
body = json.loads(body)
state_list = UsstatesG.objects.filter(st_abbr__in=body['id'])
serializer = self.get_serializer(state_list,many=True)
return Response(serializer.data)
models.py
class UsstatesG(models.Model):
st_fips = models.CharField(primary_key=True,max_length=2,unique=True)
geom = models.MultipolygonField(blank=False,null=False)
objectid = models.BigIntegerField(blank=False,null=False)
st_name = models.CharField(max_length=50,blank=False,null=False)
st_abbr = models.CharField(max_length=2,null=False,unique=True)
class Meta:
managed = False
db_table = 'US_States_G'
urls.py
from django.contrib import admin
from django.urls import include,path,re_path
from api import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'states',views.StatesViewSet)
router.register(r'states/q',views.StatesViewSet.get_by_id,basename='UsstatesG')
urlpatterns = [
path('api/location/v1/',include(router.urls)),
serializer.py
from rest_framework_gis.serializers import GeoFeatureModelSerializer
from .models import UsstatesG
class UsstatesSerializer(GeoFeatureModelSerializer):
class Meta:
model = UsstatesG
geo_field = "geom"
fields = ('st_fips','st_name','st_abbr')
read_only_fields = ('st_fips','st_abbr')
我想在请求的正文中传递参数(隐私问题) 即正文{“ id”:[“ TX”,“ CA”]}
我收到此错误:
File "C:\GIT_WS\geospatial\api\REST\APIProject\urls.py",line 31,in <module>
path('api/location/v1/',File "C:\ProgramData\Anaconda3\envs\cgeo\lib\site-packages\rest_framework\routers.py",line 78,in urls
self._urls = self.get_urls()
File "C:\ProgramData\Anaconda3\envs\cgeo\lib\site-packages\rest_framework\routers.py",line 339,in get_urls
urls = super().get_urls()
File "C:\ProgramData\Anaconda3\envs\cgeo\lib\site-packages\rest_framework\routers.py",line 237,in get_urls
routes = self.get_routes(viewset)
File "C:\ProgramData\Anaconda3\envs\cgeo\lib\site-packages\rest_framework\routers.py",line 153,in get_routes
extra_actions = viewset.get_extra_actions()
AttributeError: 'function' object has no attribute 'get_extra_actions'
由于我是DRF的新手,所以
2-筛选出传递自请求主体的值的模型的最佳方法(推荐方法)是什么?
注意:我正在处理地理空间数据,即Postgresql-PostGIS后端。我也在使用rest_framework_gis
示例代码,尤其是urls.py和views.py
的推荐代码谢谢!
解决方法
在urls.py中,您配置了错误的内容:
router.register(r'states/q',views.StatesViewSet.get_by_id,basename='UsStatesG')
所需的视图已包含在该行中:
router.register(r'states',views.StatesViewSet)
默认情况下,端点为states/get_by_id/
。如果要将端点设为states/q
,请在@action
装饰器中对其进行配置。
@action(detail=False,url_path='q')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。