我尝试对我的应用程序进行简单查询,但结果是错误的,因为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
你有什么想法吗?
答案 0 :(得分:2)
您可以在过滤器中添加一个额外的参数,以确保相关的event
不为空。
apps_querysset = Application.objects.filter(event__isnull=False, event__status_end__isnull=True)