Mongoengine - 获取对象的引用位置

时间:2016-01-03 05:23:37

标签: python mongodb flask mongoengine flask-mongoengine

我在烧瓶(python)中试用mongoengine。并试图创建一对一的领域。

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

1 个答案:

答案 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()

这样您就可以AuthorUser

进行查询
>>> Author.objects.first().username
'dr_seuss'

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