我遇到了经典的陷阱,但找不到我应该做的mongoengine的好例子。
使用标准博客示例我有类似的内容:
class Comment(EmbeddedDocument):
author = StringField()
approved = BooleanField(default=False)
class Post(Document):
id = StringField(required=True, unique=True)
comments = ListField(EmbeddedDocumentField(Comment))
对于给定的博客帖子(标识为some_id
),我只想加载已批准的评论列表。如果帖子的任何评论被批准,我会不小心加载所有评论,因为我匹配列表中的元素。
答案 0 :(得分:9)
在你的模特中试试这个:
class Comment(EmbeddedDocument):
author = StringField()
approved = BooleanField(default=False)
class Post(Document):
id = StringField(required=True, unique=True)
comments = EmbeddedDocumentListField(Comment)
注意:EmbeddedDocumentListField而不是ListField
然后以这种方式查询
comments_approved = Post.objects.get(pk=post_id).comments.filter(approve=True)
我希望能帮到你!
答案 1 :(得分:5)
由于评论包含在文档中,因此评论将始终包含所有评论。
向Post过滤器添加一个属性,仅返回已批准的评论列表,例如:
@property
def approved_comments(self):
return [comment for comment in self.comments if comment.approved]