Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “我的第三个”;“在Django中抓取对象”;邮递_Python_Django - Fatal编程技术网

Python “我的第三个”;“在Django中抓取对象”;邮递

Python “我的第三个”;“在Django中抓取对象”;邮递,python,django,Python,Django,很明显,我正在努力处理Django中各种各样的抓取对象的排列。还有一个 这是我一直在使用的同一个图书馆应用程序(以防你看到我的其他问题) 在主页上,我显示活动用户的姓名和信息(这很好)。然后,我希望显示活动用户编写的所有评论。我基本上也能做到这一点,除了它只是显示评论,而没有提及他们应该描述的书籍 所以。。。我需要能够通过书评对象抓取图书对象。换句话说,每次我显示一篇评论时,我都希望能够抓住它所涉及的书(标题和作者)。请记住,我不能通过用户(使用created_by)获取书籍,因为用户可以为他们

很明显,我正在努力处理Django中各种各样的抓取对象的排列。还有一个

这是我一直在使用的同一个图书馆应用程序(以防你看到我的其他问题)

在主页上,我显示活动用户的姓名和信息(这很好)。然后,我希望显示活动用户编写的所有评论。我基本上也能做到这一点,除了它只是显示评论,而没有提及他们应该描述的书籍

所以。。。我需要能够通过书评对象抓取图书对象。换句话说,每次我显示一篇评论时,我都希望能够抓住它所涉及的书(标题和作者)。请记住,我不能通过用户(使用created_by)获取书籍,因为用户可以为他们没有添加到数据库中的书籍编写评论。我希望这是有道理的,但我相信你会看到我正在与这些问题作斗争

在models.py中,我像这样设置我的表(请记住,用户表位于不同的应用程序中):

然后在views.py中,我试图通过引用Review对象来定义变量“book”(因为book是Review中的一个字段)。像这样:

def books_home(request):
    if request.method == "GET":
        first_name = User.objects.get(id=request.session['uid']).first_name
        last_name = User.objects.get(id=request.session['uid']).last_name
        email = User.objects.get(id=request.session['uid']).email
        user_id = User.objects.get(id=request.session['uid']).id
        reviews = Review.objects.filter(created_by=user_id)
        book = Review.objects.filter(created_by=user_id).book
        context = {
            'first_name' : first_name, 
            'email' : email,
            'last_name' : last_name,
            'reviews' : reviews,
            'book' : book
            }
        return render(request, 'html_files/home.html', context=context)
请记住,除了上下文dict中的
book=Review.objects.filter(由=user\u id.book创建)和
'book':book`之外,这里的所有内容基本上都能正常工作

还要记住,我对Django和一般编程都是新手。我相信有更优雅的方法可以做到这一点,但我坚持使用我理解的方法,所以在回答时,请尽量坚持使用我当前的代码。“让它工作,然后让它工作得更好。”

我相信我知道如何在模板中显示上下文dict,所以这不是问题。如果有帮助的话,代码在GitHub上


谢谢。

评论过滤器将返回一个评论查询集,可以是一个或多个Book实例,因此您无法访问查询集上的
.Book

你想从那些评论中退哪本书

相反,在模板中,使用
{{review.book}}
为每次审阅访问该书。要防止每次访问图书时都会碰到数据库,请使用
select\u related()

数据库访问通常不是最佳的,您要多次访问数据库(每次
.get()
)。相反,只需访问一次,并将其存储在变量中

另外,当您对用户进行筛选时,使用用户实例本身进行筛选,Django将处理簿记:

        user = User.objects.get(id=request.session['uid'])
        reviews = Review.objects.filter(created_by=user)
但是,您已经为反向外键关系定义了
related\u name
,为什么不使用它呢

修改为类似于:

def books_home(request):
    if request.method == "GET":
        user = User.objects.get(id=request.session['uid'])
        reviews = user.reviews_added.select_related('book')
        context = {
            'first_name' : user.first_name, 
            'email' : user.email,
            'last_name' : user.last_name,
            'reviews' : reviews,
            }
        return render(request, 'html_files/home.html', context=context)
每个评论都会有相关的书籍实例,因此在模板中:

{% for review in reviews %}
   {{ review.book.title }}
{% endfor %}

有关信息,请参见。

PS,如果您愿意的话;'重新使用
django,contrib.auth
当前用户将可以使用
request.user
。感谢您的帮助。这将需要我一段时间来处理,并把它放入我的代码。。。我会让你知道事情的进展!
{% for review in reviews %}
   {{ review.book.title }}
{% endfor %}