Django反向查找外键


76

我有一个场地,这个场地上发生了很多事件。我的模型如下所示:

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 2013年

实际上,这两个模型分别在各自的应用程序中,我只是将它们一起发布以解释要点:)
FLX 2013年

Answers:


120

您可以使用events = venue.event_set另一种方式。

请注意,venue.event_set是经理的对象,像Event.objects,这样你就可以打电话.all.filter.exclude和类似它来得到一个查询集。

请参阅Django文档


大!感谢那。但是,如果我想遍历事件(对于事件中的i),我将得到“'RelatedManager'对象不可迭代”
FLX

您如何将其更改为QueryObject?
mp3por '16

7
通常,@ mp3por会场.event_set.all()或会场.event_set.filter()。
aptwebapps

1
如果仍然有人看到错误AttributeError: 'Foo' object has no attribute 'bar_set',则可能要检查是否related_name在引用父模型()的子模型()的ForeignKey/ OneToOneField/上ManyToManyField进行了设置。BarFoo
巴特比


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 2013年

1
在模板中使用{{event.venue.title}}或根据您的变量{{place.venue.title}} :){% for i in venue %} {{ i.venue.title }}
rjv

我知道了,但是如何显示在此场所发生的所有事件?
FLX 2013年

过滤器返回一个数组,其中包含会场中发生的所有事件。使用for
rjv

1
venue = Event.objects.filter(venue__id=venue_id)我认为此表达式将返回Event对象的QuerySet而不是Venue对象。
smilewang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.