Django Rest Framework-查询映射表中两个字段的精确匹配
我正在使用DRF,并试图搜索映射表中的精确匹配项,以便更新该记录 我有以下表格:Django Rest Framework-查询映射表中两个字段的精确匹配,django,django-rest-framework,Django,Django Rest Framework,我正在使用DRF,并试图搜索映射表中的精确匹配项,以便更新该记录 我有以下表格: site - id - location - address circuit - id - name - ref sitecircuits - site_id - circuit_id - active_link 我当前的DRF配置如下: 看法 串行器 class MonitoringSerializerConnectivity(serializers.ModelSerializer): class
site
- id
- location
- address
circuit
- id
- name
- ref
sitecircuits
- site_id
- circuit_id
- active_link
我当前的DRF配置如下:
看法
串行器
class MonitoringSerializerConnectivity(serializers.ModelSerializer):
class Meta:
model = SiteCircuits
fields = ('site_id','circuit_id','active_link',)
网址
此url
返回所有结果(因为我根本不搜索)
我也试着使用下面的
网址:
视图:
使用url时也会失败(表示它只接受一个值而不是两个值)
有人知道这里的正确组合吗?是否需要进行任何特殊操作来过滤和更新映射表
谢谢
编辑
在重写QuerySet时,我现在得到以下错误:
Traceback:
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/viewsets.py" in view
116. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
495. response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
455. self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
466. raise exc
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
492. response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/mixins.py" in list
40. queryset = self.filter_queryset(self.get_queryset())
File "/usr/local/lib/python3.6/site-packages/rest_framework/generics.py" in filter_queryset
152. queryset = backend().filter_queryset(self.request, queryset, self)
File "/usr/local/lib/python3.6/site-packages/django_filters/rest_framework/backends.py" in filter_queryset
90. filterset = self.get_filterset(request, queryset, view)
File "/usr/local/lib/python3.6/site-packages/django_filters/rest_framework/backends.py" in get_filterset
36. return filterset_class(**kwargs)
File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py" in __init__
501. raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
Exception Type: TypeError at /api/conn_set/
Exception Value: SiteCircuits() got an unexpected keyword argument 'data'
我认为最简单的解决方案是这样尝试(覆盖
get\u queryset
方法):
我认为最简单的解决方案是这样尝试(覆盖
get\u queryset
方法):
您可以在这里使用django过滤器
from django_filters.rest_framework.backends import DjangoFilterBackend
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
filter_class = SiteCircuits
search_fields = ('site__id', 'circuit__id')
filter_backends = (filters.SearchFilter, DjangoFilterBackend)
filterset_fields = ('site__id', 'circuit__id')
您可以在这里使用django过滤器
from django_filters.rest_framework.backends import DjangoFilterBackend
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
filter_class = SiteCircuits
search_fields = ('site__id', 'circuit__id')
filter_backends = (filters.SearchFilter, DjangoFilterBackend)
filterset_fields = ('site__id', 'circuit__id')
我通过以下几点达到了我的期望: 网址: 视图:
我通过以下几点达到了我的期望: 网址: 视图:
当方法get_queryset可以完成时,不必安装第三个包。:)保持简单。是的..但是,如果要对N个字段执行相同的操作,该怎么办?在这种情况下,
get\u queryset()
方法中的代码将是其中的一部分,DRF维护人员也推荐使用这个包。。。如果:)您可以在get_queryset中创建更通用的内容。有一个循环。我宁愿避免使用第三个软件包,因为您总是需要有人来维护它。但我理解你的观点;)有人考虑过它(通用方法),创建了一些通用的东西,它得到了普及……于是第三方软件包就诞生了。当方法get_queryset可以做到这一点时,不需要安装第三方软件包。:)保持简单。是的..但是,如果你想对N个字段做同样的事情呢?在这种情况下,get\u queryset()
方法中的代码将是其中的一部分,DRF维护人员也推荐使用这个包。。。如果:)您可以在get_queryset中创建更通用的内容。有一个循环。我宁愿避免使用第三个软件包,因为您总是需要有人来维护它。但我理解你的观点;)有人考虑过它(泛型方法),创建了一些泛型的东西,它很受欢迎……于是第三方软件包诞生了。我收到一个错误SiteCircuits()得到了一个意外的关键字参数“data”,我在原始问题中发布了完整的回溯我认为您应该从视图集中删除filter_class属性。我收到一个错误SiteCircuits()获取了一个意外的关键字参数“data”,我在原始问题中发布了完整的回溯我认为您应该从视图集中删除filter_class属性。
class MonitoringSerializerConnectivity(serializers.ModelSerializer):
class Meta:
model = SiteCircuits
fields = ('site_id','circuit_id','active_link',)
def get_queryset(self):
site_id = self.kwargs['site_id']
circuit_id = self.kwargs['circuit_id']
return SiteCircuits.objects.filter(site_id=site_id,circuit_id=circuit_id)
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
Traceback:
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/viewsets.py" in view
116. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
495. response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
455. self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
466. raise exc
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
492. response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/mixins.py" in list
40. queryset = self.filter_queryset(self.get_queryset())
File "/usr/local/lib/python3.6/site-packages/rest_framework/generics.py" in filter_queryset
152. queryset = backend().filter_queryset(self.request, queryset, self)
File "/usr/local/lib/python3.6/site-packages/django_filters/rest_framework/backends.py" in filter_queryset
90. filterset = self.get_filterset(request, queryset, view)
File "/usr/local/lib/python3.6/site-packages/django_filters/rest_framework/backends.py" in get_filterset
36. return filterset_class(**kwargs)
File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py" in __init__
501. raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
Exception Type: TypeError at /api/conn_set/
Exception Value: SiteCircuits() got an unexpected keyword argument 'data'
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
# filter_class = SiteCircuits
def get_queryset(self):
qs = super(MonitoringConnectivitySet, self).get_queryset()
site = self.request.query_params.get('site')
circuit = self.request.query_params.get('circuit')
if site:
qs = qs.filter(site_id=site)
if circuit:
qs = qs.filter(circuit_id=circuit)
return qs
# Usage
http://localhost:8100/api/conn_set/?site=8&circuit=7
from django_filters.rest_framework.backends import DjangoFilterBackend
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
filter_class = SiteCircuits
search_fields = ('site__id', 'circuit__id')
filter_backends = (filters.SearchFilter, DjangoFilterBackend)
filterset_fields = ('site__id', 'circuit__id')
http://localhost:8100/api/conn_set/?site__id=8&circuit__id=7
path('conn_set/<int:site_id>/<int:circuit_id>/', views.MonitoringConnectivitySet.as_view())
class MonitoringSerializerConnectivity(serializers.ModelSerializer):
class Meta:
model = SiteCircuits
fields = ('site_id','circuit_id','active_link',)
class MonitoringConnectivitySet(generics.GenericAPIView):
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
def get(self, request, *args, **kwargs):
site_id = kwargs.get('site_id', '0')
circuit_id = kwargs.get('circuit_id', '0')
instance = get_object_or_404(SiteCircuits, site_id=site_id, circuit_id=circuit_id)
serializer = self.get_serializer(instance)
return Response(serializer.data)
def put(self, request, *args, **kwargs):
site_id = kwargs.get('site_id', '0')
circuit_id = kwargs.get('circuit_id', '0')
instance = get_object_or_404(SiteCircuits, site_id=site_id, circuit_id=circuit_id)
serializer = MonitoringSerializerConnectivity(instance, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_200_OK)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)