gpt4 book ai didi

python - Mongoengine 列表过滤

转载 作者:行者123 更新时间:2023-12-04 05:27:26 24 4
gpt4 key购买 nike

我在一些 mongoengine 的文档中有一个所需权限的列表,我想对其进行过滤。

考虑这个文档:

class Entry(Document):
required_perms = ListField(StringField())

e = Entry(required_perms=['create', 'update'])
e.save()

以下是一些用例:

all_perms = ['create', 'update', 'delete']

Entry.objects.filter(required_perms__in=all_perms)
[<Entry: Entry object>] # Returned because 'create' OR 'update' are in required_perms

Entry.objects.filter(required_perms__in=['create', 'delete'])
[<Entry: Entry object>] # Returned because 'create' is in required_perms

Entry.objects.filter(required_perms__all=all_perms)
[] # Not returned because 'delete' is not in required_perms

当使用 $in 查询时,我得到了 Entry,因为至少有一个字符串在列表中。 $all 没有满足我的需求,因为根据文档,这与我打算做的相反:“提供的值列表中的每个项目都在数组中” ;我想:“数组中的每个项目都在提供的值列表中”

所以,我想请求一些这样的东西:

Entry.objects.filter(everyoneof__required_perms__in=['create', 'delete'])

我欺骗了它来清楚地解释它,但这很丑陋,不是动态的,不应该被使用:

Entry.objects(Q(required_perms__0__in=all_perms) & Q(required_perms__1__in=all_perms))
"""
Can be tested with: all_perms = ['create', 'delete'] -> No results
and: all_perms = ['create', 'update', 'delete'] -> 1 result
"""

有没有办法做这样的事情?也许使用原始查询?

最佳答案

如果您知道顺序,那么您可以直接检查,例如:

Entry.objects.filter(required_perms=['create', 'delete'])

如果顺序不固定或未知,那么您可以使用 $all运算符(operator):

Entry.objects.filter(required_perms__all=['create', 'delete'])

更新

如果您必须确保列表中的所有元素都符合给定的要求并且它们可能存在也可能不存在 - 这是不支持的。您必须执行 __in= 然后在您的应用程序中进行过滤。

我不确定该方法。为什么要担心用户拥有额外的权限?听起来不太灵活/面向 future 。

关于python - Mongoengine 列表过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13034014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com