gpt4 book ai didi

python - Mongoengine - 获取对象被引用的位置

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:08 25 4
gpt4 key购买 nike

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

最佳答案

您的 User 文档存储在单独的集合中,不引用 Author 集合,因此如果没有额外的查询,就无法执行此操作。您可以选择一些选项来简化此过程:

User 类添加一个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)

但是,似乎在这种情况下,作者只是一种特殊类型的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.objects.first().username
'dr_seuss'

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

关于python - Mongoengine - 获取对象被引用的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com