首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否在pymodm中按对象查询相关集合?

是否在pymodm中按对象查询相关集合?
EN

Stack Overflow用户
提问于 2017-12-08 22:32:45
回答 1查看 1.4K关注 0票数 2

我在我的项目中使用pymodm进行对象关系管理。

我有一个简单的例子:

代码语言:javascript
复制
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代码中引用该对象的所有记录?

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

代码语言:javascript
复制
IdentityImage.objects.raw({'source_identity': identity.pk})

然而,必须使用'source_identity'字符串字面量有点违背了ORM的目的。在这个框架中,有没有办法通过使用IdentityRecord对象的实例来查询IdentityImage集合?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 16:17:10

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

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

代码语言:javascript
复制
IdentityImage.objects.raw(dict(source_identity=identity.pk))

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

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

代码语言:javascript
复制
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,下面的查询似乎可以在Python3.5.3中正常工作,与问题中的示例查询中所暗示的identity (IdentityRecord的一个实例)的含义相同。

代码语言:javascript
复制
IdentityImage.objects.raw(source_identity=identity.pk)

Python3.5之前的版本很可能需要在变化后的代码中使用args函数的替代实现。我还没有充分研究这种更改对查询表示法的影响,但我相信任何将raw_query作为dict传递的查询应该仍然有效,无论是否使用使用关键字参数的表示法,或者两种表示法的组合,raw_query的字典和其他字段名的单独关键字参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47716413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档