在Django模型中通过主键查找
我正在为作者(AUTHOR)写一个Django视图,首先我需要获取所有的作者。接下来,我需要利用另一个模型(书籍 - 这个模型已经包含在视图中),然后对于每个作者,我想找出他们写的所有活跃的书籍。
书籍模型有一个外键指向作者(也就是作者的ID或主键)。
我写了下面的代码……但它不工作,我有点困惑 - 有没有什么想法?
def authors(request):
_vars = {}
authors = Author.objects.all()
#loop through the authors
for author in authors.object_list:
books = Book.objects.filter(author=author.pk).filter(is_active=True, author__is_active=True).order_by('-author__author_type__importance').exclude(author__is_active=False)
author.append(books)
_vars['authors'] = authors
return render(request, 'template.html', _vars)
抱歉,补充一下 - 我无法在调试模式下运行这个,我(愚蠢地)是在一个实时环境中做的。
服务器返回了500错误,我有点不知道为什么。问题出在这一行
books = Book.objects.filter(author=author.pk).filter(is_active=True, author__is_active=True).order_by('-author__author_type__importance').exclude(author__is_active=False)
我怀疑是主键查找的问题。我在特定的作者查找中使用了完全相同的搜索,它是有效的 - 但当我在for循环中尝试引用主键时,它就失败了。
我想要的是返回一个包含所有作者(比如ID、名字、年龄等)和他们书籍(书籍ID、书名等)的列表。
我希望能有一个对象,可以通过author.name来获取作者的名字,或者通过author.books.name来获取书名 - 其实这会是一组书籍,所以我需要遍历一下 - 但你明白我的意思吧?
模板可能看起来像这样
{% for author in authors %}
Name: {{ author.name }}
Age: {{ author.age }}
{% for book in author.books %}
Title: {{ book.title }}
Published: {{ book.published }}
{% endfor %}
{% endfor %}
谢谢
3 个回答
0
好的,问题解决了...
我把那个代码块扔掉,重新开始,简单明了。
for author in authors:
author.books = ''
books = Book.objects.filter(author=author, is_active=True)
author.books = books
结果你猜怎么着...它成功了。感谢大家的帮助!
0
你没有把这个查询的结果传递给模板:
books = Book.objects.filter(author=author.pk).filter(is_active=True, author__is_active=True).order_by('-author__author_type__importance').exclude(author__is_active=False)
(另外,你不需要同时使用 filter(author__is_active=True)
和 exclude(author__is_active=False)
。)
我个人会这样做:
books = Books.objects.all().filter(is_active=True, author__is_active=True).order_by('author')
把结果传递给模板:
return render(request, 'template.html', {'books': books})
或者
return render(request, 'template.html', locals())
在模板中:
{% for b in books %}
Author: {{ b.author.name }}
Title: {{ b.title }}
{% endfor %}
或者类似的方式
0
你可以选择使用下面的方式:
books = Book.objects.filter(author=author)filter(is_active=True, author__is_active=True).order_by('-author__author_type__importance').exclude(author__is_active=False)
或者使用这个方式:
books = Book.objects.filter(author__id=author.id)filter(is_active=True, author__is_active=True).order_by('-author__author_type__importance').exclude(author__is_active=False)
这两种方法都可以正常工作。