用Djang在mongoengine数据库中寻找最佳匹配

2024-04-25 09:55:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个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中创建的最后一个对象,Ford car的名称为Bettsy。你知道吗

另一方面,调用MyModel.desired_method(plane='Airbus', some_field='hashed_msg', pilot='Ron', age='7')将返回具有指定的planesome_field字段的最后一个对象,但其他对象将被忽略,因为它们在我们的模型中不存在。你知道吗

所有这些都是为了能够灵活地扩展功能——假设我们使用model向db添加新对象,其中包含指定的carnamesome_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'),我们仍然会得到给定carname的对象,即使给定的条目没有version(添加到db-向后兼容性时它不在模型中)。你知道吗

一般来说,解决方案可以是创建一个带有动态添加字段的模型——例如

new_item = MyModel(name='John Doe', age='90')
new_item.save()

会在模型中创建一个新字段age,但我不知道这是否可行


Tags: 对象name模型fielddbreturnversionmy
1条回答
网友
1楼 · 发布于 2024-04-25 09:55:19
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>]

这回答了你的问题吗?你知道吗

相关问题 更多 >