2

フラスコ(python)でmongoengineを試しています。そして、One-to-One フィールドを作成しようとしていました。

モデルと、 、 などUserのタイプのユーザーのモデルもあります。モデルの単純なバージョンは次のとおりです。AuthorBuyer

class User(db.Document):
    username = db.StringField()
    password = db.StringField()

class Author(db.Document):
    books = db.ListField(db.StringField())
    user = db.ReferenceField(document_type=User, required=True)

これで、単純に作成者からユーザーを取得できます

a = author.objects.all()[0] # Or get author through some other method
a.user

しかし、ユーザーがいる場合、著者を取得するにはどうすればよいですか?

u = user.objects.all()[0]
u.get_author() # ???

できることはわかっていますAuthor.objects.get(user=u)が、追加のクエリなしでこれを実行できるかどうか疑問に思っていました。

4

1 に答える 1

2

Userドキュメントはコレクションへの参照なしで別のコレクションに保存されるAuthorため、追加のクエリなしでこれを行う方法はありません。このプロセスを簡単にするオプションがいくつかあります。

Userクラス に作成者プロパティを追加します。

class User(db.Document):
    username = db.StringField()
    password = db.StringField()

    @property
    def author(self):
        return Author.objects(user=self).get()

class Author(db.Document):
    books = db.ListField(db.StringField())
    user = db.ReferenceField(document_type=User, required=True)

これにより、次のことが可能になります。

u = User.objects.first()
print(u.author.books)

ただし、 author が単なる特別なタイプであるこのコンテキストでは、ドキュメントの継承Userを使用する必要があるようです。たとえば、次のようになります。

class User(db.Document):
    username = db.StringField()
    password = db.StringField()

    meta = {'allow_inheritance': True}

class Author(User):
    books = db.ListField(db.StringField())

a = Author(username="dr_seuss", password="sneech16", 
           books=["Green Eggs and Ham","The Cat in the Hat"])
a.save()

Authorこれにより、次のいずれかでクエリを実行できますUser

>>> Author.objects.first().username
'dr_seuss'

>>> User.objects.first().username
'dr_seuss'
于 2016-01-27T13:59:30.777 に答える