- MongoEngine 教程
- MongoEngine - 主頁
- MongoEngine - MongoDB
- MongoEngine - MongoDB Compass
- MongoEngine - 物件文件對映
- MongoEngine - 安裝
- MongoEngine - 連線到 MongoDB 資料庫
- MongoEngine - 文件類
- MongoEngine - 動態模式
- MongoEngine - 欄位
- MongoEngine - 新增/刪除文件
- MongoEngine - 資料庫查詢
- MongoEngine - 過濾器
- MongoEngine - 查詢運算子
- MongoEngine - QuerySet 方法
- MongoEngine - 排序
- MongoEngine - 自定義查詢集
- MongoEngine - 索引
- MongoEngine - 聚合
- MongoEngine - 高階查詢
- MongoEngine - 文件繼承
- MongoEngine - 原子更新
- MongoEngine - Javascript
- MongoEngine - GridFS
- MongoEngine - 訊號
- MongoEngine - 文字搜尋
- MongoEngine - 擴充套件
- MongoEngine 有用資源
- MongoEngine - 快速指南
- MongoEngine - 有用資源
- MongoEngine - 討論
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
廣告