2011-02-08 128 views
1

我在Django中创建了一个小日历应用程序。我有两个模型类;日历和事件。一个事件可以在多个日历中。正因为如此,我使用了ManyToMany关系。来自ManyToMany关系的QuerySet

这是我的模型

from django.db import models 

class Calendar(models.Model): 
    title = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.title 

class Event(models.Model): 
    title = models.CharField(max_length = 255) 
    start_date = models.DateField() 
    end_date = models.DateField(blank = True, null = True) 
    location = models.CharField(blank = True, max_length = 255) 
    description = models.TextField(blank = True) 
    important = models.BooleanField(default = False) 
    calendar = models.ManyToManyField(Calendar) 

我怎样才能从一个特定的日历中的所有事件查询集?

回答

1

你会使用.event_set属性上的实例日历记录。是这样的:

# create two calendars 
one = models.Calendar.objects.create(title='calendar one') 
two = models.Calendar.objects.create(title='calendar two') 

# attach event 1 to both calendars 
event = models.Event.objects.create(title='event 1', start_date='2011-11-11') 
one.event_set.add(event) 
two.event_set.add(event) 

# attach event 2 to calendar 2 
two.event_set.add(models.Event.objects.create(title='event 2', start_date='2011-11-11')) 

# get and print all events from calendar one 
events_one = models.Calendar.objects.get(title='calendar one').event_set.all() 
print [ event.title for event in events_one ] 
# will print: [u'event 1'] 

# get and print all events from calendar two 
events_two = models.Calendar.objects.get(title='calendar two').event_set.all() 
print [ event.title for event in events_two ] 
# will print: [u'event 1', u'event 2'] 

models.Calendar.objects.get(标题= '两节')event_set.all()

1

Django的自动提供一种方式来访问在多对多关系相关的对象:

events = my_calendar.events.all() 

参见many-to-many relationships的文档。

如果你不已经有一个日历实例,但只是一个ID或名称,你可以做整个事情在一个查询:

events = Event.objects.filter(calendar__id=my_id) 
+1

除非指定`related_name ='events'`在`ManyToManyField`,不该它读取my_calendar.event_set.all()`? – Arnaud 2011-02-09 02:46:59