假设我们有一个类似于此的Django模型:
from mongoengine import (Document, StringField, DateTimeField)
class MyModel(Document):
car = StringField()
plane = StringField()
name = StringField()
some_field = SecretField()
date = DateTimeField()
# some more fields ...
然后,我们想从我们的数据库中获取一组给定参数的最佳匹配对象,例如
@classmethod
def desired_method(cls, **kwargs):
# for a given kwargs, choose the one that have fields in db
# and return object for that parameter (ordered by date, say last one)
例如,调用MyModel.desired_method(car='Ford', name='Bettsy')
将返回在db中创建的最后一个对象,而福特汽车的名称为Bettsy。
另一方面,调用MyModel.desired_method(plane='Airbus', some_field='hashed_msg', pilot='Ron', age='7')
将返回具有指定plane
和some_field
字段的最后一个对象,但其他字段将被忽略,因为它们在我们的模型中不存在。
所有这一切的目的是能够灵活扩展功能 - 假设我们使用模型向db添加新对象,具有指定的car
,name
和some_field
字段。对于一些填充的数据库,我们收到客户端的请求,以开始通过另一个字段version
区分对象。我们不能倒退,但我们可以在模型中添加字段version
,使用新条目填充数据库,并从以下位置更改应用程序中的代码:
my_car = return_car()
my_name = return_name()
result = MyModel.desired_method(car=my_car, name=my_name)
为:
my_car = return_car()
my_name = return_name()
my_version = return_version()
result = MyModel.desired_method(car=my_car, name=my_name, version=my_version)
这样,如果我们致电MyModel.desired_method(car='Ford', name='Bettsy',version='123')
,我们仍会获得给定car
和name
的对象,即使给定的条目没有version
(它不在模型,同时添加到db - 向后兼容性)。
更一般地说,解决方案可以创建一个动态添加字段的模型 - 例如
new_item = MyModel(name='John Doe', age='90')
new_item.save()
会在模型中创建一个新字段age
,但我不知道它是否可能
答案 0 :(得分:0)
In [12]: class MyModel(Document):
...: car = StringField()
...: plane = StringField()
...: name = StringField()
...: some_field = StringField()
...: date = DateTimeField()
...: @queryset_manager
...: def desired_method(cls, queryset, **kwargs):
...: return queryset(**kwargs)
...:
In [13]: MyModel.desired_method(car='Ford', name='Betsy')
Out[13]: []
In [14]: car = MyModel(car='Ford', name='Betsy').save()
In [15]: MyModel.desired_method(car='Ford', name='Betsy')
Out[15]: [<MyModel: MyModel object>]
这会回答你的问题吗?