首页 > 解决方案 > 动态地将参数传递给 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。

标签: pythonpython-3.xdjangodjango-views

解决方案


完整的请求字符串将如下所示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


推荐阅读