MongoEngine 自定义查询集


默认情况下,文档类的 objects 属性返回 QuerySet 而不应用任何过滤器。但是,你可以在修改查询集的文档上定义类方法。这样的方法应该接受两个参数—— doc_cls 和 queryset 并且需要用 queryset_manager() 修饰才能被识别。

@queryset_manager
    def qry_method(docs_cls,queryset):
       ….
       ----

在下面的示例中,名为 products 的文档类有一个由 @queryset_manager 修饰的成本昂贵的_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))
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 类中,元属性指的是这个 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