Mongoengine列表过滤

2024-04-29 10:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一些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
"""

有没有办法做到这一点?也许是一个原始的查询


Tags: in文档列表objectsobjectcreaterequiredupdate
1条回答
网友
1楼 · 发布于 2024-04-29 10:21:28

如果您知道订单,则可以直接进行检查,例如:

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

如果顺序不固定或未知,则可以使用^{}运算符:

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

更新

如果您必须确保列表中的所有元素都符合给定的要求,并且它们可能存在,也可能不存在,则不支持这种情况。您必须执行__in=操作,然后在应用程序中进行筛选

我不确定该怎么办。为什么要担心用户有额外的权限?听起来不太灵活/经得起未来考验

相关问题 更多 >