[英]Django mongoengine - filter string that does not contains values from list
我正在嘗試使用 django 中的 mongoengine 從 mongodb 過濾對象。
假設我有以下 class:
class Person(Document):
name = StringField()
我想過濾名稱不包含“Jhon”或“Doe”的所有 Person 對象。
我可以用該代碼實現這一點:
Person.objects.filter(
name__not__contains="Jhon"
).filter(
name__not__contains="Doe"
)
但我想只用一個“過濾器”調用來做到這一點。
我已經嘗試過:
Person.objects.filter(name__not__contains=["Jhon", "Doe"])
但我收到以下錯誤:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/code.py", line 91, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/queryset.py", line 144, in count
return super().count(with_limit_and_skip)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 399, in count
count = self._cursor.count(with_limit_and_skip=with_limit_and_skip)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 1666, in _cursor
self._cursor_obj = self._collection.find(self._query, **self._cursor_args)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 1715, in _query
self._mongo_query = self._query_obj.to_query(self._document)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/visitor.py", line 90, in to_query
query = query.accept(QueryCompilerVisitor(document))
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/visitor.py", line 185, in accept
return visitor.visit_query(self)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/visitor.py", line 79, in visit_query
return transform.query(self.document, **query.query)
File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/transform.py", line 120, in query
value = field.prepare_query_value(op, value)
File "/usr/local/lib/python3.6/site-packages/mongoengine/fields.py", line 152, in prepare_query_value
value = re.escape(value)
File "/usr/local/lib/python3.6/re.py", line 276, in escape
return bytes(s)
TypeError: 'str' object cannot be interpreted as an integer
這有可能實現我想要的嗎?
如果要匹配整個字符串,可以使用__nin
查詢運算符來實現
class Person(Document):
name = StringField()
john = Person(name="John").save()
bob = Person(name="Bob").save()
fu = Person(name="Fu").save()
persons = list(Person.objects(name__nin=["John", "Bob"]))
assert len(persons) == 1
assert persons[0] == fu
如果要使用“不包含”,可以將條件與Q 運算符結合起來,例如
Person.objects(Q(name__not__contains="John") | Q(name__not__contains="F"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.