Django:查询多个外键

Posted

技术标签:

【中文标题】Django:查询多个外键【英文标题】:Django: Querying Multiple Foreign Keys 【发布时间】:2012-05-22 10:32:11 【问题描述】:

首先,我确定这是一个简单的问题。我刚刚开始使用 Django,和所有初学者一样,我想我会建立一个简单的博客。

我有一个简单的数据模型,一个包含通过 FK 指向用户的链接的 Post 模型。

models.py

class Post(TimeStampedActivate):
    """
    A blog post
    """
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    excerpt = models.TextField(blank=True)
    body = models.TextField()
    publish_at = models.DateTimeField(default=datetime.datetime.now())
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=False, help_text='Is the blog post active?')
    user = models.ForeignKey(User, related_name='post_user')

    def __unicode__(self):
        return self.title

然后我想要一个页面,其中列出了所有帖子以及创建帖子的人的用户名。我当前的视图如下所示:

views.py

def index(request):
    posts = Post.objects.filter(active=True)   
    user = User.objects.get(id=1)
    return render(request, 'blog/index.html', 'posts': posts, 'user': user)

我的模板 目前只显示与 ID 为 1 匹配的用户名。

% for post in posts %
    <h2><a href=" post.get_absolute_url "> post.title </a></h2>
    <p> post.excerpt|truncatewords:30 </p>
    <p>Posted by  user.first_name   user.last_name </p>
% endfor %

我将如何修改我的 views.py 文件以确保我获得负责该帖子的用户的名字和姓氏?

【问题讨论】:

【参考方案1】:

查看:

def index(request):
    posts = Post.objects.filter(active=True)   
    return render(request, 'blog/index.html', 'posts': posts)

模板:

% for post in posts %
    <h2><a href=" post.get_absolute_url "> post.title </a></h2>
    <p> post.excerpt|truncatewords:30 </p>
    <p>Posted by  post.user.first_name   post.user.last_name </p>
% endfor %

【讨论】:

非常感谢阿尔普!我想多了。我想象着做 for 循环和各种疯狂的巫术。 不客气。我也是 django 的新手,从上周开始。如果您有兴趣,请查看我当前(未回答的)问题:) 我会浏览一下您的问题,看看是否可以提供帮助。 :) 除此答案外,请查看select_related 以防止每次发布额外的数据库查询以获取用户表信息。【参考方案2】:

在您的模板中使用“post.user”,而不仅仅是“user”。

 post.user.first_name   post.user.last_name 

“user”是当前登录的用户。

如果您使用 RequestContext 并将身份验证添加到您的 TEMPLATE_CONTEXT_PROCESSORS,则用户等于 request.user。 https://docs.djangoproject.com/en/dev/topics/auth/#authentication-data-in-templates

【讨论】:

他指定userUser,pk=1。另外,request.user不是登录用户吗? request.useruser 在模板中是等价的 如果您使用 RequestContext 并为您的 TEMPLATE_CONTEXT_PROCESSORS 添加了身份验证,则用户等于 request.user。 docs.djangoproject.com/en/dev/topics/auth/…我之前对此感到困惑,因为我不知道用户总是可用的。 ch3ka:是的。你对否决票负责吗?我没有冒犯。我的答案和正确答案差不多。 我是。抱歉,您的回答似乎指向了错误的方向。介意在答案中澄清这一点吗?那么我会删除反对票。

以上是关于Django:查询多个外键的主要内容,如果未能解决你的问题,请参考以下文章

没有外键关系实例的 Django 查询多对一关系

Django外键查询,为啥它返回None?

Django 查询集外键

Django,从反向外键查询添加数据(外键加入过滤器)

Django 外键查询

带有嵌套序列化程序的 Django 反向外键给出了多个结果