mongoengine 上的关系如何运作?

问题描述 投票:0回答:1

我是 mongoengine 的新手,我正在尝试关联两个文档。

class Actor(Document):
    name = StringField(required=True, unique=True)
    movies = ListField()

class Movie(Document):
    title = StringField(required=True, unique=True)
    release_date = DateField()
    director = StringField()
    cast = ListField(ReferenceField(Actor))

我想列出演员名单并让电影出现。或者列出看起来相关的电影和演员。

在我的脑海里,我想到了这样的事情:

class Actor(Resource):
    def get_actors(self) -> Response:
        for actor in Actor.objects.all():
            movies = Movie.objects(actors=actor)
            [...]
        return Response(planets, mimetype='application/json', status=200)

这是一条有效的路径,还是我在 Postgres 和 Mongo 中的头脑不同?有什么想法吗?

python mongodb flask mongoengine
1个回答
0
投票

在mongoengine中,如果您使用ReferenceField,这将自动查询设置为Actor。所以你只需要创建一个函数来返回一个字典值。

class Actor(Document):
    name = StringField(required=True, unique=True)
    movies = ListField()

    def as_dict(self):
        return {
            "id": str(self.pk),
            "name": self.name,
            "movies": self.movies
        }

class Movie(Document):
    title = StringField(required=True, unique=True)
    release_date = DateField()
    director = StringField()
    cast = ListField(ReferenceField(Actor))
    
    def as_dict(self):
        return {
            "id": str(self.pk),
            "title": self.title,
            "release_date": self.release_date.isoformat(),
            "director": self.director,
            "cast": [i_cast.as_dict() for i_cast in self.cast]
        }

在API中,查询后只需调用ac_dict即可返回数据

def get_actors(self) -> Response:
    actors = Actor.objects.all()
    return Response([actor.as_dict() for actor in actors], mimetype='application/json', status=200)
© www.soinside.com 2019 - 2024. All rights reserved.