我是 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 中的头脑不同?有什么想法吗?
在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)