django - Django Rest Framework - 查询映射表中两个字段的完全匹配
问题描述
我正在使用 DRF 并尝试在映射表中搜索完全匹配的内容,以便更新该记录。
我有以下表格:
site
- id
- location
- address
circuit
- id
- name
- ref
sitecircuits
- site_id
- circuit_id
- active_link
我当前的 DRF 配置如下:
看法
class MonitoringConnectivitySet(viewsets.ModelViewSet):
queryset = SiteCircuits.objects.all()
serializer_class = MonitoringSerializerConnectivity
permission_classes = (IsAdminUser,)
filter_class = SiteCircuits
filter_backends = (filters.SearchFilter,)
search_fields = ('site__id','circuit__id')
串行器
class MonitoringSerializerConnectivity(serializers.ModelSerializer):
class Meta:
model = SiteCircuits
fields = ('site_id','circuit_id','active_link',)
网址
router.register(r'conn_set', views.MonitoringConnectivitySet)
这个网址http://localhost:8100/api/conn_set/?site__id=8&circuit__id=7 返回所有结果(因为我根本不搜索)
我也尝试使用以下
网址:
path('conn_set/<int:site_id>/<int:circuit_id>/', views.MonitoringConnectivitySet)
序列化器:
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,)
使用 url 时也会失败(表明它只需要一个值而不是两个 http://localhost:8100/api/conn_set/8/7
有人知道这里的正确组合吗?过滤和更新映射表有什么特别需要做的吗?
谢谢
编辑
覆盖 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_queryset
方法):
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
推荐阅读
- google-app-engine - Google App Engine Errno 60 操作超时
- git - GitVersion 和 NuGet - 意外的版本排序
- prolog - 纯 append/3 用于不会留下选择点的模式 (-,+,+)
- amazon-web-services - EC2 实例之间通过域名的 HTTPS 流量
- javascript - 刷新网页时如何防止倒数计时器重置?
- python - python中文件的回文
- java - 如何通过 Java Main 方法运行或启动 Play 框架项目
- python - 大小为 x 的 1 的二维阵列菱形
- asp.net-mvc - ASP.NET Core Identity 是否使用会话进行身份验证?
- android - 获取在 Oreo 后在前台打开的应用程序