如何在mongoengine中的每个查询中添加默认过滤器参数?

时间:2019-08-04 03:59:59

标签: mongoengine

我已经做了很多研究,但是还没有找到方法。 我有Document个带有_owner属性的小节,该属性指定所有者的ObjectID,这是每个请求的值,因此它在全球范围内可用。我希望能够默认设置查询的一部分。

例如,执行此查询

MyClass.objects(id='12345')

应该和做的一样

MyClass.objects(id='12345', _owner=global.owner)

因为默认情况下始终添加_owner=global.owner

我还没有找到一种方法来覆盖objects,并且使用queryset_class有点令人困惑,因为我仍然必须记得调用“ .owned()”管理器来添加过滤器每次我想查询一些东西。

它最终就这样...

MyClass.objects(id='12345').owned() 
// same that ...
MyClass.objects(id='12345', _owner=global.owner)

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

以下应该可以解决查询问题(使用常量owned=True可以简化示例,但可以轻松地将其扩展为使用全局变量):

class OwnedHouseWrapper(object):
    # Implements descriptor protocol

    def __get__(self, instance, owner):
        return House.objects.filter(owned=True)

    def __set__(self, instance, value):
        raise Exception("can't set .objects")


class House(Document):
    address = StringField()
    owned = BooleanField(default=False)

class OwnedHouse:
    objects = OwnedHouseWrapper()

House(address='garbage 12', owned=True).save()
print(OwnedHouse.objects())    # [<House: House object>]
print(len(OwnedHouse.objects)) # 1