我在烧瓶(python)中试用mongoengine。并试图创建一对一的领域。
我有一个模型User
,还有Author
,Buyer
等用户类型的模型。这是我的模型的简单版本:
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)
,但我想知道是否可以在没有额外查询的情况下完成。
答案 0 :(得分:1)
您的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)
但是,在这种情况下,作者只是User
的特殊类型,您应该使用document inheritance,例如:
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'