【问题标题】:Django how to add query results foreign key model to querysetDjango如何将查询结果外键模型添加到查询集
【发布时间】:2022-01-04 07:43:09
【问题描述】:

如何通过B 模型的外键将Author 模型对象放入查询集中?我想在我的模板中使用Author 对象。

#Models.py
    
class Book(models.Model):
        name = models.CharField(max_length=5)

class Author(models.Model):
    # lots of fields

class B(models.Model):
    author = models.ForeignKey(Author)
    book = models.ForeignKey(Book)

selected_book = "ABC"
book = Book.objects.get(name=selected_book)
original_queryset = B.objects.filter(name=book)

for i in original_queryset:
    print(i.author) # returns what i want
    queryset = # get all i.author objects somehow

return render(request,"template.html", {"queryset": queryset}

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    删除for 循环。然后在original_queryset = B.objects.filter(name=book)行之后添加以下行->

    queryset = original_queryset.author

    如果这不起作用,请告诉我。希望能帮到你。

    您可以将B 模型的author 字段重命名为authors,这使您的代码更有意义,因为ForeignKey 字段可以存储许多数据。在您的代码中,您将B 模型的author 字段设置为ForeignKey 字段,这意味着书籍 可以有多个作者。可以看ForeignKey reference的django文档。 如果您按照我告诉您的方式进行更改,请不要忘记运行迁移(您的 cmd 中的python manage.py makemigrationspython manage.py migrate 命令)并将queryset = original_queryset.author 行更改为queryset = original_queryset.authors

    另一种方法

    您可以在模板的context 中传递original_queryset,(即:{'queryset':original_queryset })然后在您的template.html 中,您可以添加这样的标签:

    {% for book in queryset %}
    <ul>
    {% for author in book.author %}
    <li>author.name</li>
    ....
    {% endfor %}
    </ul>
    {% endfor %} 
    

    通过这样做,您可以将您的书籍和作者很好地放入您的模板中。如果仍然显示错误,请给我留言,希望我能帮到你。

    【讨论】:

    • 感谢 Omayer 的帮助,print(original_queryset) 的结果返回一个字典。 ]>,这就是我使用for循环的原因。因此,按照您的建议进行操作会返回错误“'QuerySet' 对象没有属性'author'”
    • 问题是我试图让查询集成为一个字典,而不是我认为我已经尝试过,但我只需要让它成为一个列表就可以了。
    • @Nick 我已经在另一种方法中编辑了我的答案,如果您按照步骤操作,那么我希望不会发现任何错误。
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2015-03-09
    • 2018-07-25
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多