2011-04-08 121 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