MongoEngine - 自定義查詢集



預設情況下,文件類上的物件屬性返回一個 QuerySet,而不應用任何過濾器。然而,你可以在文件上定義一個類方法來修改 queryset。此類方法應接受兩個引數 - doc_cls 和 queryset,並且需要用 queryset_manager() 來裝飾,才能被識別。

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

在下面的示例中,名為 products 的文件類有一個 expensive_prods() 方法,該方法由 @queryset_manager 裝飾。該方法本身將過濾器應用於 queryset,以便僅返回價格 >20000 的物件。此方法現在是預設文件查詢,products 類的物件屬性返回過濾後的文件。

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”結尾的名稱欄位的文件。在 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
廣告
© . All rights reserved.