在Django模型中通过PK查找

时间:2014-06-27 11:07:47

标签: python django lookup

我在AUTHOR的django视图中工作,我首先需要拉起所有作者。接下来我需要利用另一个模型(Book - 包含在视图中),对于每个作者,我想找到他们已经写好的活动的书。

Book模型具有作者的外键(作者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 :(得分: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 %}

或类似的东西

答案 1 :(得分: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)

两者都可以使用

答案 2 :(得分:0)

好的解决了......

我扔掉了这个街区并重新开始,很好很简单

for author in authors:
    author.books = ''
    books = Book.objects.filter(author=author, is_active=True)
    author.books = books

你知道什么......它有效。 谢谢大家的帮助!