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


person TristanMatthews    schedule 20.02.2014    source источник


Ответы (2)


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

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

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

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

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)

Я надеюсь помочь вам!

person leocoder    schedule 05.08.2015
comment
Круто, это нужно выбрать в качестве ответа ) - person Artem Bernatskyi; 17.04.2017