[英]python mongoengine EmbeddedDocumentListField and aggregate
我現在想如果 MongoEngine aggregate()
功能僅適用於 QuerySet? 嗯,這是我正在做的項目
#imports
class Status(Enum):
ACTIVE = "active"
CLOSED = "closed"
class OrderType(Enum):
BUY = "buy"
SELL = "sell"
class Order(EmbeddedDocument):
type = EnumField(OrderType, required=True)
vol = IntField(required=True)
time = DateTimeField(required=True, default=datetime.now())
class Stock(EmbeddedDocument):
name = StringField(max_length=20, required=True)
orders = EmbeddedDocumentListField(Order, required=True)
status = EnumField(Status, required=True, default=Status.ACTIVE)
amount = IntField(required=True, default=0)
pnl = FloatField()
class Portfolio(Document):
account = IntField(required=True, unique=True)
stocks = EmbeddedDocumentListField(Stock, required=True)
balance = FloatField()
equity = FloatField()
我希望能夠使Stock.amount
字段成為Order.vol
的聚合,可以看出,它是股票的 EmbeddedDocumentListField。 我已經了解 mongoengine.signals 並查看了有關 aggregate() 的示例,但它們都在.objects()
。 那么它的調整是什么? 非常感謝。
目前我想出了這個:
def handler(event):
def decorator(fn):
def apply(cls):
event.connect(fn, sender=cls)
return cls
fn.apply = apply
return fn
return decorator
@handler(signals.post_init)
def update_amount(sender, document):
orders = document.orders
amnt = 0
for order in orders:
if order.type == OrderType.Buy:
amnt += order.vol
else:
amnt -= order.vol
document.amount = amnt
然后我將裝飾器@update_amount.apply
添加到我的Stock
class 中。 但如果可能的話,它會更好地與聚合一起使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.