Набор запросов из отношения ManyToMany

Я создаю небольшое приложение-календарь в Django. У меня есть два модельных класса; Календарь и событие. Событие может быть в нескольких календарях. Из-за этого я использую отношение 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)

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


person Sindre Sorhus    schedule 08.02.2011    source источник


Ответы (3)


Вы должны использовать атрибут .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 ()

person Tim    schedule 08.02.2011

Django автоматически предоставляет способ доступа к связанным объектам в отношении ManyToMany:

events = my_calendar.events.all()

См. Документацию по отношениям "многие ко многим".

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

events = Event.objects.filter(calendar__id=my_id)
person Daniel Roseman    schedule 08.02.2011
comment
Если вы не укажете related_name='events' в ManyToManyField, не следует ли читать my_calendar.event_set.all()? - person Arnaud; 09.02.2011

mycalendar = Calendar.objects.get (id = 1)

events = mycalendar.event_set.all ()

Взято и изменено с: http://docs.djangoproject.com/en/dev/topics/db/queries/#many-to-many-relationships

person canisrufus    schedule 08.02.2011