2014-03-05 48 views
2

沒有反向的關係有了這些機型中選擇項目:與在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

對於Event對象,總是存在隱式的反向關係,甚至是event_classification_set管理器。

這將選擇Event對象,而不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) 

你可以獲得重複的事件,每個分類一個。你可以用它來消除它們

Event.objects.filter(event_classification__isnull=False).distinct() 
+0

那麼簡單嗎?整齊。 – Nis