2

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

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)

但是,似乎在这种情况下,作者只是一种特殊类型,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 回答