MongoEngine - 自定义查询集
默认情况下,文档类上的 objects 属性返回一个 QuerySet,而不应用任何过滤器。 但是,您可以在修改查询集的文档上定义一个类方法。 这样的方法应该接受两个参数——doc_cls 和 queryset 并且它需要用 queryset_manager() 修饰以使其被识别。
@queryset_manager def qry_method(docs_cls,queryset): …. ----
在下面的示例中,名为 products 的文档类有一个 expensive_prods() 方法,该方法由 @queryset_manager 修饰。 该方法本身将过滤器应用于查询集,以便仅返回价格大于 20000 的对象。 此方法现在是产品类返回过滤文档的默认文档查询和对象属性。
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 类作为自定义查询集的定义。 该类中的myqrymethod()过滤name字段以'er'结尾的文档。 在 products 类中,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