2011-04-08 124 views
0

我是Django的新手,我被困在多個集合的查詢中。Django通過集合查詢

我有三種模式;

class Project(models.Model): 
    name = models.CharField(max_length = 100) 

class AppointmentGroup(models.Model): 
    name = models.CharField(max_length = 100) # not used in design.. delete when not used at the end of the project 
    project = models.ForeignKey(Project) 
    location = models.ForeignKey(Location) 

class Appointment(models.Model): 
    appointment_group = models.ForeignKey(AppointmentGroup) 
    start_date = models.DateTimeField() 
    end_date = models.DateTimeField() 

現在我想設置一個返回對象,只設置具有特定年份內約會的項目。而且項目對象中的約會集對象僅包含那年的那些對象!

這是很容易做的Django查詢或必須循環通過項目一個接一個,並檢查日期的所有約會?

+1

怎樣項目涉及到預約嗎?我在您發佈的數據模型中沒有看到任何外鍵關係。 – rubayeet 2011-04-08 08:07:14

+0

我在清理這個問題的代碼時意外地刪除了它。更新了類。 – 2011-04-08 08:33:41

回答

1

我猜,約會模型是一些如何與您的項目相關,你剛剛離開。

你可能想使用rangelookups that span relationships

import datetime 
start = datetime.date(2010, 1, 1) 
end = datetime.date(2010, 12, 31) 
projects_in_2010 = Projects.objects.filter(appointmentgroup__appointment__start_date__range(start, end)) 
+0

好吧,現在我已經擁有了該範圍內的所有項目。但是,我怎麼能通過該項目對象的所有約會?那麼我需要過濾約會組織吧? – 2011-04-08 09:54:45

+0

可以說你想要返回的查詢集的第一個項目的約會。 'project = projects_in_2010 [0]'然後'約會= Appointment.objects.filter(appointment_group__project =項目)' – DTing 2011-04-08 09:54:48

+0

好吧,但是我得到從該項目返回的所有約會(也不2010年日期)。但我明白了,只需在該查詢中再次添加範圍過濾器即可。 Thx man! – 2011-04-08 09:58:59

0

試試這個

AppointmentGroup.objects.filter(appoinment_set__start_date__year=2011, appoinment_set__end_date__year=2011) 
+0

重新閱讀這裏的文檔:http://docs.djangoproject.com/en/1.0/topics/db/queries/#following-relationships-backward _set用於當你有一個對象並且想要關係關係時向後。這對於過濾不起作用,您只需使用小寫的模型名稱。你也會返回AppointmentGroup對象,問題是要求Project對象queryset。 – DTing 2011-04-08 08:46:19

+0

@ krieger pardon我對Django ORM的理解很差,但是從AppointmentGroup到Appointment似乎存在一對多關係。這不就是'_set'發揮的地方嗎? – rubayeet 2011-04-08 08:59:46

+0

查看文檔中給出的示例。如果你有一個AppointmentGroup對象,你可以使用_set,但是你試圖過濾哪些不起作用。例如'ag = AppointmentGroup.objects.get(pk = 1)',那麼你可以使用'ag.appointment_set.all()'獲得與'ag'有關的所有約會。希望這是有道理的。要過濾跨度關係,請查看我答案中發佈的文檔鏈接。 – DTing 2011-04-08 09:11:35