Python Mongoengine-获取引用对象的位置

Python Mongoengine-获取引用对象的位置,python,mongodb,flask,mongoengine,flask-mongoengine,Python,Mongodb,Flask,Mongoengine,Flask Mongoengine,我正在试用烧瓶中的mongoengine(python)。并试图创建一个一对一的字段 我有一个模型用户,还有一个模型适用于作者、买家等类型的用户。以下是我的模型的简单版本: class User(db.Document): username = db.StringField() password = db.StringField() class Author(db.Document): books = db.ListField(db.StringField())

我正在试用烧瓶中的mongoengine(python)。并试图创建一个一对一的字段

我有一个模型
用户
,还有一个模型适用于
作者
买家
等类型的用户。以下是我的模型的简单版本:

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)
,但我想知道这是否可以在没有额外查询的情况下完成。

您的
用户
文档存储在一个单独的集合中,没有对
Author
集合的引用,因此没有额外查询就无法做到这一点。您有一些选项可以简化此过程:

将author属性添加到
用户
类:

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)
然而,在这种情况下,如果作者只是一种特殊类型的
用户
,那么您应该使用,例如:

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.objects.first().username
'dr_seuss'

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

这房子好主意!遗憾的是,如果没有额外的查询,就无法做到这一点。(作者用户示例是一个简化的示例,在我的实际案例中,我无法实现文档继承。)如果您更关心读优化而不是写优化,那么您可以在编写时始终将引用存储在两个文档中。