如何在模板中显示具有外键关系的元素?

Posted

技术标签:

【中文标题】如何在模板中显示具有外键关系的元素?【英文标题】:How do I display elements in a template that have foreignkey relationships? 【发布时间】:2012-11-12 13:50:27 【问题描述】:

我正在尝试显示用户保存为播放列表一部分的每个视频的视频网址。用户也可以保存多个播放列表(视图中的第一行显示所有播放列表)。不过,我正在努力弄清楚如何在每个播放列表中显示视频。有什么建议吗?

views.py

def profile(request):
    playlist = UserPlaylist.objects.filter(profile=request.user)
    
    return render_to_response('reserve/templates/profiles.html', 'playlist':playlist,
        context_instance=RequestContext(request))

models.py

class Playlist(models.Model):
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.playlist
    
class Video(models.Model):
    video_url = models.URLField('Link to video', max_length = 200, null=True, blank=True)
    def __unicode__(self):
        return self.video_url

class UserPlaylist(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.ForeignKey(Playlist)
    def __unicode__(self):
        return unicode(self.playlist)

class Videoplaylist(models.Model):
    video = models.ForeignKey(Video)
    playlist = models.ForeignKey(UserPlaylist)
    def __unicode__(self):
        return unicode(self.playlist)

模板:profiles.html

% for feed in playlist %

    feed
    
    <br>

% endfor %

【问题讨论】:

【参考方案1】:

可以使用.访问外键关系来跨越关系

feed.playlist.playlist

feed.profile.username

因为这是UserPlaylist 对象的查询集,所以它们具有profileplaylist 属性。

不过要小心!我确实相信每次访问外部关系时都会进行单独的查询。我不确定,但值得在调试工具栏或其他东西上查看。

根据 Victor 'Chris' Cabral 的说法,您可以使用

向后跨越关系

[model_you_want_to_span]_set.all

您也可以使用

在您的视图中进行此查找

vpls = Videoplaylist.objects.filter(playlist__profile=request.user)

% for feed in playlist %    
    feed
    % for vpl in feed.videoplaylist_set.all %    
       vpl.video.video_url     
    % endfor %    
    <br>    
% endfor %

【讨论】:

你知道我将如何访问每个用户播放列表中的视频吗? % for feed in playlist.videoplaylist_set.all % [model]_set.all 将遵循“向后”的关系。 docs.djangoproject.com/en/dev/topics/db/queries % endfor % 我正在使用 feed.videoplaylist_set.all 但我无法显示视频网址。我试过 feed.videoplaylist_set.videos.all 但这似乎也不起作用。 @sharataka 给出了例子,做一些教程和阅读关于如何查询模型的 django 书会很有帮助。另外我认为这会进行大量查询,可能是分析它的好主意

以上是关于如何在模板中显示具有外键关系的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中查询具有特定数量的外键关系并且在这些外键值中具有特定值的对象?

Django模型加入一对多关系以在模板中显示

如何使用 Graphene-Django Relay 中的外键关系更新模型?

在django模板中按id的顺序显示查询集及其外键

在 django 模板中显示外键值

如何根据具有外键关系的另一个模型更新 Django 模型的字段