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'。
据我所知 - 正确的方法是使用注释或案例/何时?
如何实现?
答案 0 :(得分:1)
好吧,您要让ORM返回Asset
字段为Session
且device_id
为GUID
的{{1}},因此,这肯定是{{ 1}}-给定的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()
不为NULL时仅在布尔True
之后,则使用Exists应该没问题。