簡體   English   中英

Django mongoengine - 過濾不包含列表值的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM