Django ORM并通过注释退出联接?

问题描述 投票:1回答:1
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'。

据我所知-正确的方法是使用AnnotateCase / When

如何实现?

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

[好,您要让ORM返回Asset且其Session字段设置为device_idGUID,因此,这肯定是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应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.