Mongoengine: Как получить один конкретный c встроенный документ? - PullRequest
0 голосов
/ 08 мая 2020

Как я могу получить один конкретный c встроенный документ, например, по идентификатору с mongoengine?

Это мои модели:

class Project(Document):
    project_name = StringField(unique=True, required=True)
    literature = ListField(EmbeddedDocumentField(Literature))

class Literature(EmbeddedDocument):
    id = ObjectIdField(required=True, default=ObjectId,
                        unique=True, primary_key=True, sparse=True)
    title = StringField()

, и я хочу получить спецификацию c Объект литературы, например, с идентификатором «2».

Я пробовал это:

literature = Project.objects(project_name=project_name).get(
        literature__id=2).literature

, но это дает мне все объекты литературы, а не только тот, который имеет идентификатор «2»

Я также пробовал что-то вроде этого:

literature = Project.objects.get(project_name=project_name).literature.filter(
        literature__id=2)

, но это вызывает ошибку AttributeError: 'BaseList' object has no attribute 'filter'

так что есть ли способ получить только этот c встроенный документ (литература с ID = 2)? Не знаю, что еще я могу сделать

Ура

1 Ответ

0 голосов
/ 11 мая 2020

Когда вы выполняете запрос, он все равно будет указывать на документ c Project с упомянутым liteature__id. Вы должны использовать filter для запроса.

literature = Project.objects.filter(project_name=project_name,literature__id=id)

Это по-прежнему будет указывать на объект Project, поскольку вы выполняете запрос на Project, а Literature - это встроенный документ внутри.

...