如何在django-nonrel中查询EmbeddedModelField的ListField中的字段?

时间:2013-09-07 02:43:58

标签: django mongodb pymongo django-orm django-nonrel

假设我有这个:

class Parent(models.Model):
    id = models.IntegerField(primary_key=True)
    children = ListField(EmbeddedModelField('Child'))

class Child(models.Model):
    id = models.IntegerField(primary_key=True)

在mongo交互式shell中,使用特定子项查找Parent是如此简单:

db.myapp_parent.find({'children.id': 123})

这是如何在django-nonrel中完成的?

我尝试了一些方法,包括我查找了原始查询,但由于某种原因,raw_results不是Parent.objects中的方法。

FWIW,这就是我的需求.txt:

git+https://github.com/django-nonrel/django@nonrel-1.3
git+https://github.com/django-nonrel/djangotoolbox@toolbox-1.3
git+https://github.com/django-nonrel/mongodb-engine@mongodb-engine-1.3

2 个答案:

答案 0 :(得分:5)

我想我自己找到了答案:

https://groups.google.com/forum/#!topic/django-non-relational/kCLOcI7nHS0

基本上,看起来还不支持。

因此,解决方法是原始查询。

为了进行原始查询,应将问题中的代码修改为:

from django_mongodb_engine.contrib import MongoDBManager


class Parent(models.Model):
    id = models.IntegerField(primary_key=True)
    children = ListField(EmbeddedModelField('Child'))

    objects = MongoDBManager()


class Child(models.Model):
    id = models.IntegerField(primary_key=True)

然后

Parent.objects.raw_query({'children.id': 123})

作品。

答案 1 :(得分:1)

看了一会儿突然,以下mentioned there对我来说就像魔术一样,这似乎避免了对原始查询的需要(适合你的例子):

from django_mongodb_engine.query import A

...

Parent.objects.filter( children = A('id', '123') )

至于要求:

git+https://github.com/django-nonrel/django@nonrel-1.5
git+https://github.com/django-nonrel/djangotoolbox@toolbox-1.8
git+https://github.com/django-nonrel/mongodb-engine
#(django-mongodb-engine==0.6.0)
#(pymongo==3.2)