Django ORM和左连接 - 通过注释?

时间:2017-06-24 02:13:06

标签: django django-models django-orm

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'。

据我所知 - 正确的方法是使用注释案例/何时

如何实现?

1 个答案:

答案 0 :(得分:1)

好吧,您要让ORM返回Asset字段为Sessiondevice_idGUID的{​​{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应该没问题。