2

いくつかの 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

でクエリを実行すると$inEntry少なくとも 1 つの文字列がリストに含まれているため、 が返されます。$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
"""

そのようなことをする方法はありますか?多分生のクエリで?

4

1 に答える 1

3

注文がわかっている場合は、直接チェックを行うことができます。例:

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

順序が固定されていないか不明な場合は、次の$all演算子を使用できます。

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

アップデート

リスト内のすべての要素が指定された要件に一致し、それらが存在する場合と存在しない場合があることを確認する必要がある場合、これはサポートされていません。アプリケーションでを実行してから__in=フィルタリングする必要があります。

アプローチがわかりません。ユーザーが追加の権限を持っていることを心配するのはなぜですか?あまり柔軟に聞こえません/将来性があります。

于 2012-10-23T16:31:18.740 に答える