Mongoengine 简明教程
MongoEngine - Custom Query Sets
默认情况下,文档类上的 object 属性返回未应用任何筛选器的 QuerySet。但是,您可以在文档上定义类方法来修改查询集。此类方法应该接受两个参数 - doc_cls 和 queryset
,并且需要用 queryset_manager()
装饰它才能被识别。
@queryset_manager
def qry_method(docs_cls,queryset):
….
----
在下面的示例中,名为 products 的文档类有一个经过 @queryset_manager
装饰的 expensive_prods() 方法。该方法本身将过滤器应用于查询集,以便仅返回价格 >20000 的对象。此方法现在是默认文档查询,products 类的 objects 属性返回已筛选的文档。
from mongoengine import *
con=connect('newdb')
class products (Document):
ProductID=IntField(required=True)
company=StringField()
Name=StringField()
price=IntField()
@queryset_manager
def expensive_prods(docs_cls,queryset):
return queryset.filter(price__gt=20000)
for product in products.expensive_prods():
print ("Name:{} company:{} price:{}".format(product.Name, product.company, product.price))
Output
Name:Laptop company:Acer price:25000
Name:TV company:Samsung price:50000
Name:TV company:Philips price:31000
Name:Laptop company:Dell price:45000
如果您希望自定义过滤文档的方法,请首先声明 QuerySet 类的子类,并将其用作元数据中的 queryset_class
属性的值。
以下示例使用 MyQuerySet 类作为自定义查询集的定义。此类中的 myqrymethod() 过滤名称字段以“er”结尾的文档。在 products 类中,meta 属性引用此查询集子类,用作 queryset_class
属性的值。
from mongoengine import *
con=connect('newdb')
class MyQuerySet(QuerySet):
def myqrymethod(self):
return self.filter(Name__endswith='er')
class products (Document):
meta = {'queryset_class': MyQuerySet}
ProductID=IntField(required=True)
company=StringField()
Name=StringField()
price=IntField()
for product in products.objects.myqrymethod():
print ("Name:{} company:{} price:{}".format(product.Name, product.company, product.price))