Python “我的第三个”;“在Django中抓取对象”;邮递
很明显,我正在努力处理Django中各种各样的抓取对象的排列。还有一个 这是我一直在使用的同一个图书馆应用程序(以防你看到我的其他问题) 在主页上,我显示活动用户的姓名和信息(这很好)。然后,我希望显示活动用户编写的所有评论。我基本上也能做到这一点,除了它只是显示评论,而没有提及他们应该描述的书籍 所以。。。我需要能够通过书评对象抓取图书对象。换句话说,每次我显示一篇评论时,我都希望能够抓住它所涉及的书(标题和作者)。请记住,我不能通过用户(使用created_by)获取书籍,因为用户可以为他们没有添加到数据库中的书籍编写评论。我希望这是有道理的,但我相信你会看到我正在与这些问题作斗争 在models.py中,我像这样设置我的表(请记住,用户表位于不同的应用程序中): 然后在views.py中,我试图通过引用Review对象来定义变量“book”(因为book是Review中的一个字段)。像这样:Python “我的第三个”;“在Django中抓取对象”;邮递,python,django,Python,Django,很明显,我正在努力处理Django中各种各样的抓取对象的排列。还有一个 这是我一直在使用的同一个图书馆应用程序(以防你看到我的其他问题) 在主页上,我显示活动用户的姓名和信息(这很好)。然后,我希望显示活动用户编写的所有评论。我基本上也能做到这一点,除了它只是显示评论,而没有提及他们应该描述的书籍 所以。。。我需要能够通过书评对象抓取图书对象。换句话说,每次我显示一篇评论时,我都希望能够抓住它所涉及的书(标题和作者)。请记住,我不能通过用户(使用created_by)获取书籍,因为用户可以为他们
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 %}