MongoEngine – 自定义查询集
默认情况下,文档类上的对象属性会返回一个查询集,而不应用任何过滤器。然而,你可以在一个文档上定义一个类方法来修改一个查询集。这样的方法应该接受两个参数 – doc_cls 和 queryset,并且需要用 queryset_manager() 来装饰,以便被识别。
@queryset_manager
def qry_method(docs_cls,queryset):
….
----
在下面的例子中,名为products的文档类有一个被@queryset_manager装饰过的昂贵的prods()方法。该方法本身对queryset应用了一个过滤器,使得只有价格>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))
输出
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类作为自定义queryset的定义。这个类中的myqrymethod()可以过滤那些名字字段以’er’结尾的文档。在产品类中,meta属性指的是这个queryset子类,被用作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))
输出
Name:Router company:Iball price:2000
Name:Scanner company:Cannon price:5000
Name:Printer company:Cannon price:12500