在Django模型中通过主键查找

0 投票
3 回答
1934 浏览
提问于 2025-04-18 11:18

我正在为作者(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)

这两种方法都可以正常工作。

撰写回答