2011-02-08 4 views
1

Я создаю небольшое приложение для календарей в Django. У меня два модельных класса; Календарь и событие. Событие может быть в нескольких календарях. Из-за этого я использую отношение ManyToMany.Queryset from ManyToMany отношение

Это моя модель

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) 

Как я могу получить QuerySet со всеми событиями из определенного календаря?

ответ

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 автоматически обеспечивает способ доступа связанные объекты в отношениях ManyToMany:

events = my_calendar.events.all() 

Смотрите документацию на many-to-many relationships.

Если вы уже не имеете календарный экземпляр, а только идентификатор или имя, вы можете сделать все это в одном запросе:

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

Если не указано 'related_name = 'events'' на' ManyToManyField', не должен 't он читал 'my_calendar.event_set.all()'? – Arnaud

Смежные вопросы