我与 3 个模型的关系相当简单,并且在构建以我需要的方式返回结果的查询集时遇到问题。
楷模:
class Book(models.Model):
name = models.CharField()
class CategoryLabel(models.Model):
name = models.CharField()
class Review(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)
labels = models.ManyToManyField(CategoryLabel)
rating = models.IntegerField()
现在,查询集的结果应该是特定用户写过评论的书籍列表。
这很容易实现 books = Book.objects.filter(review__user=user)
棘手的部分是我需要输出(通过 django rest 框架序列化程序)一个书籍列表,每个书籍包含一个仅针对指定用户的评论列表、聚合平均评分(同样,仅针对指定用户)和一组评论被标记的不同标签。
所以在 JSON 中是这样的:
[
"name": "Book1",
"reviews": [
"review_id1", "review_id2"
],
"average_rating": 3,
"labels": [
"label_id1", "label_id2"
]
]
到目前为止我尝试过的:
Book.objects.filter(reviews__user=user)
.annotate(average_rating=Avg("reviews__rating"))
.annotate(labels=ArrayAgg("reviews__labels", distinct=True))
任何想法如何尽可能有效地实现这一目标?数据库是 PostgreSQL,因此 pg 特定功能是一个选项。
翻翻过去那场雪
倚天杖
相关分类