python - 动态地将参数传递给 objects.filter
问题描述
我对 Django 很陌生,我正在尝试从过滤器函数中获取查询集。这个过滤器函数应该能够接受 1 到 5 个参数,我不知道如何处理它。
我在这里没有找到任何可能对我有帮助的东西,所以如果您知道其他可能有帮助的问题,请告诉我。
views.py
:
@api_view(('Get',))
def update(request, REQUEST):
if request.method == "Get":
requestlist = REQUEST.split('&')
for keys in requestlist:
if 'module' in keys:
module = keys[8:]
if 'value' in keys:
value = keys[6:]
if 'user' in keys:
user= keys[5:]
if 'time1' in keys:
time1 = keys[6:]
if 'time2' in keys:
time2 = keys[6:]
item = Post.objects.filter(name=Name, user=USER, ...)
完整的请求字符串看起来像name=NAME&value=VALUE&user=USER&time1=FIRSTTIME&time2=SECONDTIME
,但它也可以是单个变量的任意组合,例如name&time1
.
现在我希望能够使用一种过滤方法来做到这一点,而不是为每个不同的 szenario 创建 2^5。
解决方案
完整的请求字符串将如下所示
name=NAME&value=VALUE&user=USER&time1=FIRSTTIME&time2=SECONDTIME
。
这是一个查询字符串[wiki],Django 会自动将其解析为类字典QueryDict
,因此您不应自己指定它。您可以使用:
if request.method == 'GET':
Post.objects.filter(**request.GET.dict())
然而,我建议只允许特定的密钥,而不是所有的密钥,因为这样数据库就不那么安全了:可以使用过滤机制来检索数据。
因此,使用以下方法可能会更好:
datas = {}
accept_keys = {'module', 'value', 'user', 'time1', 'time2'}
for key, value in request.GET.dict().items():
if key in accept_keys:
datas[key] = value
if request.method == 'GET':
Post.objects.filter(**datas)
在这种情况下,路径后面的项目是查询字符串,路径和查询字符串之间的分隔符是问号 ( ?
)。
因此,路径如下所示:
urlpatterns = [
# …,
path('some/path/', views.update, name='update'),
# …
]
因此,您使用 查询路径。some.host.com/some/path?name=NAME&value=VALUE&user=USER&time1=FIRSTTIME&time2=SECONDTIME
推荐阅读
- ios - React Native IOS 状态栏背景
- function - 函数什么都不做
- laravel - 首次在 Heroku 上部署 Laravel 5.7 时出错
- neo4j - 在导入 CSV 时为节点的属性创建列表类型集合
- python - Python selenium 未在 Chrome 中显示证书错误页面
- python - 在 Keras 预测后显示百分比
- hazelcast-jet - hazelcast jet 是否从集群发送/接收数据
- php - 由于单选按钮错误,我的数据没有插入数据库
- docker - var/jenkins_home 文件夹在哪里?
- java - 从 Android Volley 请求在 Spring Boot 中使用和生成 JSON 数据的正确方法是什么