我在我的项目中使用 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 集合?
最佳答案
pymodm.manager.Manager 中的选择性查询(例如问题示例中的 IdentityImage.objects)似乎需要一个 dict 作为 get 和 raw 方法的参数。相比之下,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 中正常工作,对于 identity 具有相同的含义(一个实例IdentityRecord) 隐含在问题的示例查询中。
IdentityImage.objects.raw(source_identity=identity.pk)
3.5 之前的 python 版本可能需要在变异代码中替代实现 args 函数。我还没有完全探讨这种更改对查询符号的影响,但我相信任何将 raw_query 作为 dict 传递的查询都应该仍然有效,无论是否使用符号它使用关键字参数,或两种表示法的组合,raw_query 的字典和其他字段名称的单独关键字参数。
关于mongodb - 在pymodm中按对象查询相关集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47716413/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que