4

4日以来、参照されているクラスから始めて、あるクラスから別のクラスへの参照をたどる方法を理解しようとしています。SQL-Djangoには、related_nameこれを達成するための...

たとえば、私はこのクラスを持っています:

class MyClass(Document):
    ...
    other_classes = ListField(ReferenceField(Other_Class))

そしてこれ:

class Other_Class(Document):
    ...

今から行きたいOther_Class...MyClass何かアイデアはありますか?

ありがとう、

ロン

4

3 に答える 3

3

これを照会する方法を示すテスト ケースを次に示します。

import unittest
from mongoengine import *


class StackOverFlowTest(unittest.TestCase):

    def setUp(self):
        conn = connect(db='mongoenginetest')

    def test_one_two_many(self):

        class MyClass(Document):
            other_classes = ListField(ReferenceField("OtherClass"))

        class OtherClass(Document):
            text = StringField()

        MyClass.drop_collection()
        OtherClass.drop_collection()

        o1 = OtherClass(text='one').save()
        o2 = OtherClass(text='two').save()
        m = MyClass(other_classes=[o1, o2]).save()

        # Lookup MyClass that has o1 in its other_classes
        self.assertEqual(m, MyClass.objects.get(other_classes=o1))

        # Lookup MyClass where either o1 or o2 matches
        self.assertEqual(m, MyClass.objects.get(other_classes__in=[o1, o2]))

主な質問は、参照のリストを に保存する必要があるMyClassかどうかです。OtherClass..だけに関係を保存する方が効率的かもしれません。

于 2012-08-03T09:35:36.597 に答える
0

このクエリを試してください:

oc = Other_Class()
MyClass.objects.find( other_classes__all = [oc.id] )
于 2012-08-03T08:38:36.513 に答える
0

私の問題について考えているうちに、私は解決策を思いつきました。

参照するクラスの ID をモデルに追加するだけです。

次に例を示します。

class MyClass(Document):
    ...
    other_classes = ListField(ReferenceField(Other_Class))

class Other_Class(Document):
    myclass = ReferenceField(MyClass)

これがMongoのやり方かどうかはよくわかりませんが、うまくいくと確信しています:)

other_classesオプションで、冗長性を避けるために属性を省略できますMyClassが、「子」オブジェクトを取得するには、次のようなクエリが必要です。

Other_Class.objects(myclass = myclass.id)
于 2012-08-03T08:34:39.113 に答える