django查询生成LEFT OUTER JOIN而不是INNER JOIN

时间:2017-03-21 17:25:11

标签: django join orm

我尝试对我的应用程序进行简单查询,但结果是错误的,因为Django ORM会生成LEFT OUTER JOIN。但我喜欢INNER JOIN的结果

以下是我模特的一部分:

class Application(models.Model):
    """ Une application """
    app_name = models.CharField(max_length=20)
    app_pub_date = models.DateTimeField(auto_now_add=True, editable=True)


class Event(models.Model):
    """ Evenement status """
    STATUS = (
        ('OK', 'OK'),
        ('KO', 'KO'),
        ('DEGRADE', 'DEGRADE'),
    )

    app = models.ForeignKey(Application, on_delete=models.CASCADE)
    status_start = models.DateTimeField()
    status_end = models.DateTimeField(null=True, blank=True, editable=True)
    status_global = models.CharField(max_length=20, choices=STATUS,default='OK')

我试图检索所有的应用程序'具有"打开事件的对象" (这意味着具有Null' status_end'值的事件):

这个简单的SQL查询有效:

select a.app_name from  event e, application a where a.id = e.app_id and e.status_end is null;

我写了这个django代码:

apps_querysset = Application.objects.filter(event__status_end__isnull=True)

然而,这段代码创建了一个LEFT OUTER JOIN,所以有很多应用程序'返回的对象。

SELECT "appstat_application"."id", "appstat_application"."app_name", "appstat_application"."app_pub_date", "appstat_application"."app_type_id", "appstat_application"."app_site_id" FROM "appstat_application" LEFT OUTER JOIN "appstat_event" ON ("appstat_application"."id" = "appstat_event"."app_id") WHERE "appstat_event"."status_end" IS NULL

你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以在过滤器中添加一个额外的参数,以确保相关的event不为空。

apps_querysset = Application.objects.filter(event__isnull=False, event__status_end__isnull=True)