Asset.objects.filter(
campaigns__games__pk=_version.game_id,
campaigns__is_active=True,
campaigns__games__active=True,
is_active=True).select_related('org').all()
此查询返回49条记录
Asset.objects.filter(
campaigns__games__pk=_version.game_id,
campaigns__is_active=True,
campaigns__games__active=True,
is_active=True,
coupons__session__device_id='GUID').select_related('org').all()
仅ONE,因为它使INNER JOIN到Asset.coupons.session表。实际上,我想检索与第一个查询相同的49条记录,但是要从会话表中检索其他信息(如果存在)。
所以我想实现的是LEFT JOIN,所以如果存在给定资产的会话,那么我在API响应中设置标志'is_saved = True'。
据我所知-正确的方法是使用Annotate或Case / When?
如何实现?
[好,您要让ORM返回Asset
且其Session
字段设置为device_id
的GUID
,因此,这肯定是INNER JOIN
-必须存在Session
给定的Asset
,以便您可以查询其上的字段。
您应该可以使用以下方法实现所需的功能:
Asset.objects.filter(
campaigns__games__pk=_version.game_id,
campaigns__is_active=True,
campaigns__games__active=True,
is_active=True,
).annotate(
session__device_id=F('coupons__session__device_id')
# any other fields can go here
).select_related(
'org'
).all()
或者如果True
不为NULL时仅在布尔值coupons__session
之后,则使用Exists应该可以。