首页 > 解决方案 > 想要通过电子邮件过滤模型对象,但是过滤在 Django REST api 中不起作用

问题描述

我在 Django REST 框架中有我的 API:

这是我的models.py:

class myModel(models.Model):
    user_email = models.CharField(max_length= 200, null= False)

这是我的views.py:

class GetItemsByEmail(generics.ListAPIView):
   def get_queryset(self):
       email_items = self.request.query_params.get("user_email")
       if(email_items is not None):
          itemsReturned =  myModel.objects.all().filter(user_email = email_items)
          return Response(data= itemsReturned)

这是我的 urls.py:

url_patterns = [
   path('users/account=<str:id>/items', GetItemsByEmail.as_view()),
   ]

我的问题:

我得到一个空列表,对上述端点进行 API 调用一无所获。我想获取与特定电子邮件关联的数据库中的所有项目,但过滤器不起作用?这背后的原因是什么?

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


您在 URL 中定义了参数,因此这是一个 URL 参数。request.query_params然而,它不是由路径决定的,而是由查询字符串[wiki]决定的。

您通过 获取 URL 参数self.kwargs,因此:

class GetItemsByEmail(generics.ListAPIView):
    
    def get_queryset(self):
        #    use self.kwargs ↓
        email_items = self.kwargs.get('user_email')
        if email_items is not None:
            return myModel.objects.filter(user_email=email_items)
        else:
            # return some queryset
            pass

urls.py应该更新以使用user_email,而不是id

url_patterns = [
   path('users/account=<str:user_email>/items', GetItemsByEmail.as_view()),
]

虽然并非不可能,但在 URL 中使用等号或包含电子邮件地址并不常见,这些通常是通过查询字符串或在请求的有效负载中包含非 GET 请求的情况下完成的,或者标题。


推荐阅读