【问题标题】:Querying related collection by object in pymodm?在pymodm中按对象查询相关集合?
【发布时间】:2018-05-22 19:41:54
【问题描述】:

我在我的项目中使用pymodm 作为 ORM。

我有以下简单案例:

class IdentityRecord(MongoModel):
    alias = fields.CharField()  # normal name for identity


class IdentityImage(MongoModel):
    filename = fields.CharField()  # filename on filesystem
    source_identity = fields.ReferenceField(IdentityRecord)  # reference to an identity

我们可以看到,每个IdentityImage 都指向IdentityRecord

如果我有对象IdentityRecord,那么如何从IdentityImage 中找到所有在python 代码中引用该对象的记录?

当然,我可以做到以下几点:

IdentityImage.objects.raw({'source_identity': identity.pk})

但是,用户 'source_identity' 字符串文字的必要性有点违背了 ORM 的目的。在这个框架中有什么方法可以通过使用IdentityRecord 对象的实例来查询IdentityImage 集合吗?

【问题讨论】:

  • 您好,您找到解决方案了吗?
  • 嗨。我还没有找到这个特定问题的解决方案。对不起:(

标签: mongodb python-3.x orm pymongo pymodm


【解决方案1】:

pymodm.manager.Manager 中的选择性查询(例如问题示例中的IdentityImage.objects)似乎需要dict 作为getraw 方法的参数。相比之下,sqlalchemy query 中的 filter_by 方法接受关键字参数。

如果你更喜欢关键字参数而不是字符串文字,下面的表达式似乎可以工作。

IdentityImage.objects.raw(dict(source_identity=identity.pk))

在该表达式中省略 dict 包装表明 raw 方法不接受字段名称作为关键字参数。如果修改 pymodm 以允许这样做,则此类查询的表示法会更简单。

以下代码是问题中原始代码的突变。第一个import 行在原始代码中是隐含的,在这里是显式的。另外两行import 启用了新类KWQuerySet 的定义和使用。除了新类args 的辅助函数之外,唯一的其他变化是最后一行,原始代码中的一个类中的一个新属性,它使用了新类。

from pymodm import MongoModel, fields
from pymodm.queryset import QuerySet
from pymodm.manager import Manager

def args(arg=None, **kwargs):
    return {**arg, **kwargs} if arg else kwargs

class KWQuerySet(QuerySet):
    def raw(self, raw_query=None, **kwargs):
        return super().raw(args(raw_query, **kwargs))
    def get(self, raw_query=None, **kwargs):
        return super().get(args(raw_query, **kwargs))

class IdentityRecord(MongoModel):
        alias = fields.CharField()  # normal name for identity                                                                                                                                                                                                                                                                                                          

class IdentityImage(MongoModel):
    filename = fields.CharField()  # filename on filesystem                                                                                                                                                                                                                                                                                                             
    source_identity = fields.ReferenceField(IdentityRecord)  # reference to an identity                                                                                                                                                                                                                                                                                 
    objects = Manager.from_queryset(KWQuerySet)()

使用变异代码中IdentityImage 的定义,以下查询似乎在python 3.5.3 中正常工作,与示例查询中隐含的identityIdentityRecord 的实例)的含义相同问题。

IdentityImage.objects.raw(source_identity=identity.pk)

3.5 之前的 python 版本可能需要在变异代码中替代实现 args 函数。我还没有完全探讨这种更改对查询表示法的影响,但我相信任何将raw_query 作为dict 传递的查询仍然可以工作,无论是否使用关键字参数的表示法,或两者​​的组合符号,raw_query 的字典和其他字段名称的单独关键字参数。

【讨论】:

  • 这已经足够好了,我会接受这个答案 - 非常好的简单想法。但是,在我看来,它仍然没有完全解决问题。但是,带有 kwargs 的 dict 构造函数要好得多。谢谢!
  • 通过增强pymodm 将字段名称作为本地kwargs 处理,可能最好在应用程序中而不是pymodm 本身中使用子类来完全解决该问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多