Python Mongoengine-获取引用对象的位置
我正在试用烧瓶中的mongoengine(python)。并试图创建一个一对一的字段 我有一个模型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())
用户
,还有一个模型适用于作者
、买家
等类型的用户。以下是我的模型的简单版本:
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'
这房子好主意!遗憾的是,如果没有额外的查询,就无法做到这一点。(作者用户示例是一个简化的示例,在我的实际案例中,我无法实现文档继承。)如果您更关心读优化而不是写优化,那么您可以在编写时始终将引用存储在两个文档中。