【问题标题】:Mongoengine - get where the object is referredMongoengine - 获取引用对象的位置
【发布时间】:2016-04-07 00:44:04
【问题描述】:

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

【问题讨论】:

    标签: python mongodb flask mongoengine flask-mongoengine


    【解决方案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'
    

    【讨论】:

    • 关于物业的好主意!遗憾的是,如果没有额外的查询,就没有任何方法可以做到这一点。 (作者用户示例是一个简化示例,在我的真实案例中,我无法实现文档继承。)
    • 如果您更关心读取优化而不是写入优化,那么您始终可以在撰写本文时将参考存储在两个文档中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2016-10-14
    • 2015-06-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多