Django 过滤和注释混淆

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

我有两个模型

model A:
   cid = ...
   rating = ...

model B:
   id = ... (this id is same as cid in model A. But no foreign key directly)
   name = ....

现在我需要评分大于 3 的所有 modelB 对象的列表。

我还需要评级字段在结果查询集中可用。

我做了以下,

good_rating_A_queryset = A.filter(rating__gt=3)

good_rating_B_queryset = B.filter( id__in = good_rating_A_queryset.values("cid") )

现在我有所有评分大于 3 的 B 对象。

现在我想在

rating
中保留
good_rating_A_queryset
good_rating_B_queryset
字段,这样我就可以序列化它并发送到前端。

我正在使用 DRF 进行序列化。我想访问像

good_rating_B_queryset.first().rating

这样的评级

我以为我可以使用注释但无法弄清楚如何映射字段

请帮忙

django django-models django-orm
1个回答
1
投票

我同意@WillemVanOnsem,在定义两个相互依赖的模型时最好使用 OneToOne 或 ForeignKey。这就是数据库中存在关系的原因。

除此之外,如果您仍然需要来自另一张桌子的

rating
,那么您可以使用
Subquery
。像这样:

from django.db.models import OuterRef, Subquery

good_rating_A_queryset = A.filter(pk=OuterRef('pk')).values('rating')
good_rating_B_queryset = B.annotate(rating=Subquery(good_rating_A_queryset[:1])).filter(rating__gt=3)
© www.soinside.com 2019 - 2024. All rights reserved.