Django зворотний пошук зовнішніх ключів


77

У мене є місце проведення, там відбувається багато подій. Мої моделі виглядають так:

class Event(models.Model):
    title = models.CharField(max_length=200)
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True)
    date_start = models.DateTimeField('start date')
    date_end = models.DateTimeField('end date')
    def __unicode__(self):
        return self.title
    description = models.TextField()
    price = models.IntegerField(null=True, blank=True)
    venue = models.ForeignKey(Venue)

class Venue(models.Model):
    title = models.CharField(max_length=200)
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True)
    venue_latitude = models.CharField(max_length=200)
    venue_longitude = models.CharField(max_length=200)
    venue_address = models.CharField(max_length=200)
    venue_city = models.CharField(max_length=200)
    venue_state = models.CharField(max_length=200)
    venue_country = models.CharField(max_length=200)
    description = models.TextField()
    def __unicode__(self):
        return u'%s' % (self.title)

Я хотів би показати всі події, що відбуваються на певному місці. Як я можу це зробити? Мій поточний вигляд виглядає так:

def detail(request, venue_id):
    venue = get_object_or_404(Venue, pk=venue_id)
    return render(request, 'venue-detail.html', {'venue': venue})

До якого модуля відносяться ці поля також description = models.TextField ()?
donkeyboy72,

Насправді, ці дві моделі є у своєму додатку, я просто розмістив їх разом, щоб пояснити суть :)
FLX,

Відповіді:


123

Ви можете використовувати events = venue.event_setінший шлях.

Зверніть увагу , що venue.event_setце об'єкт менеджер, як Event.objects, так що ви можете зателефонувати .all, .filter, .excludeі схоже на те , щоб отримати QuerySet.

Див. Документацію Django


Чудово! Дякую за це. Однак, якщо я хочу здійснити ітерацію над подіями (для i в подіях), я отримую "" об'єкт RelatedManager "не піддається ітерації"
FLX,

Як ви змінили його на QueryObject?
mp3por

7
@ mp3por venue.event_set.all () або venue.event_set.filter (), як правило.
aptwebapps

2
Якщо хтось все ще бачить помилку AttributeError: 'Foo' object has no attribute 'bar_set', можливо, ви захочете перевірити, чи related_nameвстановлено в ForeignKey/ OneToOneField/ ManyToManyFieldдочірньої моделі ( Bar) посилання на батьківську модель ( Foo).
Бартлбі

7

Для тих, у кого "об'єкт" RelatedManager "не піддається ітерації"

Додати все, щоб отримати елементи з менеджера.

{% for area in world_areas.all %}

https://stackoverflow.com/a/16909142/2491526 (не можна додати це в коментарі до першої відповіді)


Ви щойно зберегли моє посилання на день .
shaan

Я збирався створити безлад у своїх моделях, перш ніж знайшов це: D
PowerAktar

3

Ідіть навпаки. Використовуйте Eventмодель.

def detail(request, venue_id):
    venue = Event.objects.filter(venue__id=venue_id)
    return render(request, 'venue-detail.html', {'venue': venue})

PS: Я ніколи не користувався get_object_or_404(). Змініть код відповідно.


То що я можу використовувати у своєму шаблоні для відображення назви місця проведення та всіх подій, що відбуваються на цьому місці?
FLX

1
у шаблоні використовуйте {{event.venue.title}} або відповідно до ваших змінних {{venue.venue.title}} :){% for i in venue %} {{ i.venue.title }}
rjv

Я розумію це, але як відобразити всі події, що відбуваються на цьому місці?
FLX

фільтр повертає масив, що містить усі події, що відбуваються на venue.loop над масивом у шаблонах, використовуючиfor
rjv

1
venue = Event.objects.filter(venue__id=venue_id)Я думаю, що цей вираз поверне QuerySet об'єкта Event замість об'єкта Venue.
smilewang
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.