簡體   English   中英

python mongoengine EmbeddedDocumentListField 和聚合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM