python - 想要通过电子邮件过滤模型对象,但是过滤在 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 调用一无所获。我想获取与特定电子邮件关联的数据库中的所有项目,但过滤器不起作用?这背后的原因是什么?
解决方案
您在 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 请求的情况下完成的,或者标题。
推荐阅读
- java - 加载共享库 test/libaegean.dll 时出错:没有这样的文件或目录
- mysql - 事务方法不在数据库上写入更新
- javascript - 在茉莉花测试和 TypeError 中模拟“管道”:无法读取未定义的属性“管道”
- xamarin.forms - Xamarin.Forms 如何在 App 的所有页面上添加背景图片
- swift - SwiftUI Mac OS DatePicker 在编辑时跳回一天
- php - 当会话 cookie 在 Laravel 中过期时重新加载站点
- c# - TradingView/Binance 指标的历史数据
- javascript - 追加一个字符N次的最快方法
- python - 使用 @numpy.vectorize 在 pandas 中减去 2 个 datetime64 列
- java - 有什么方法可以在 WIre Mock 中测试数组类型查询参数