在Django中选择没有反向关系的项目

时间:2014-03-05 14:34:22

标签: django

使用这些模型:

from django.db import models

class Event(models.Model):
    recording = models.ForeignKey(Recording)

    start_sample = models.IntegerField()
    end_sample = models.IntegerField()

class Detection_method(models.Model):
    name = models.CharField(max_length = 200)

class Event_type(models.Model):
    name = models.CharField(max_length = 200)

class Event_classification(models.Model):
    event = models.ForeignKey(Event)
    method = models.ForeignKey(Detection_method)
    event_type = models.ForeignKey(Event_type)

可以使用不同的检测方法将事件分类为多种类型。

如何选择没有Event_classifications的活动?

修改:并且相关,选择具有一个或多个特定分类的活动?

1 个答案:

答案 0 :(得分:2)

event_classification_set个对象上始终存在隐式反向关系甚至是Event经理。

这将选择没有Event的{​​{1}}个对象:

Event_classifications

它将执行此查询:

Event.objects.filter(event_classification__isnull=True)

请注意,如果您尝试执行相反的操作

SELECT ...
FROM "event"
LEFT OUTER JOIN "event_classification"
  ON ("event"."id" = "event_classification"."event_id")
WHERE "event_classification"."id" IS NULL

您可以获得重复的事件,每个分类一个。您可以使用

消除它们
Event.objects.filter(event_classification__isnull=False)