mongoengine запросить список встроенных документов

Я сталкиваюсь с классической ловушкой, но не могу найти хороший пример с 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) Я просто хочу загрузить список утвержденных комментариев. Я продолжаю случайно загружать все комментарии, если какие-либо комментарии к посту одобрены, потому что я сопоставляю элемент списка.

2 ответа

Решение

Поскольку комментарии содержатся в документе, комментарии всегда будут содержать все комментарии.

Добавьте в Post свойство, которое фильтрует и возвращает только список утвержденных комментариев, например:

@property
def approved_comments(self):
    return [comment for comment in self.comments if comment.approved]

Попробуйте это в ваших моделях:

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)

Надеюсь, вам поможет!

Другие вопросы по тегам