【发布时间】:2020-09-25 20:53:17
【问题描述】:
今天我的行为很奇怪。我在我的用户视图集中添加了一个自定义 mixin,以按用户名和密码以及其他字段过滤用户。代码如下所示:
class MultipleFieldLookupMixin(object):
"""
Apply this mixin to any view or viewset to get multiple field filtering
based on a `lookup_fields` attribute, instead of the default single field filtering.
"""
def get_object(self):
queryset = self.get_queryset() # Get the base queryset
queryset = self.filter_queryset(queryset) # Apply any filter backends
filter = {}
for field in self.lookup_fields:
if field in self.kwargs.keys(): # Ignore empty fields.
filter[field] = self.kwargs[field]
obj = get_object_or_404(queryset, **filter) # Lookup the object
return obj
class UserView(MultipleFieldLookupMixin, viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
lookup_fields = ['username', 'pwd', 'token_confirm', 'email', 'token_cng_pwd']
我希望列表操作能够过滤每个给定参数中的查询集(如果没有可用参数则为 None,如果所有参数可用则为 all)。
但列表端点继续向我显示每个用户,而不过滤它们。
我哪里错了?我必须手动设置过滤器后端吗?我在做一些愚蠢的错误吗? 非常感谢
也许我必须将这些参数放在 urls.py 中?
我没有更改 urls.py,但它抛出了一个异常:
router.register('user', views.UserView)
router.register('user/username/{username}/', views.UserView, username = 'username')
router.register('user/username/{username}/pwd/{pwd}/', views.UserView, username = 'username', pwd = 'pwd')
router.register('user/email/{email}/', views.Userview, email = 'email')
router.register('user/token_confirm/{token_confirm}/', views.UserView, token_confirm = 'token_confirm')
router.register('user/token_cng_pwd/{token_cng_pwd}/', views.UserView, token_cng_pwd = 'token_cng_pwd')
例外:
router.register('user/username/{username}', views.UserView, username = 'username')
TypeError: register() got an unexpected keyword argument 'username'
我不是要过滤查询,但我会试一试!
【问题讨论】:
-
也许我找到了在此链接django-rest-framework.org/api-guide/routers/… 中解释的解决方案
-
将路由器添加到 django rest 框架的提示,它非常晦涩但似乎是我需要的 django-rest-framework.org/tutorial/6-viewsets-and-routers
标签: django python-3.x django-rest-framework