【发布时间】:2017-06-30 12:02:23
【问题描述】:
假设我们有一个类似这样的 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'),即使给定条目没有version,我们仍然会得到给定car 和name 的对象(添加到db 时它不在模型中-向后兼容)。
更一般地说,解决方案可以是创建一个具有动态添加字段的模型 - 例如
new_item = MyModel(name='John Doe', age='90')
new_item.save()
会在模型中创建一个新字段age,但我不知道这是否可能
【问题讨论】:
-
你真正想要达到什么目的?有一个通用的模型类型,可以容纳多种对象??
标签: python django mongodb mongodb-query mongoengine