避免在Django管理界面的列表视图中使用1+n个查询
创始人
2024-12-17 03:30:09
0

在Django管理界面的列表视图中,可以通过使用select_related()方法来避免1+n个查询的问题。select_related()方法可以在查询关联的对象时,一次性将所有相关的对象都查询出来,减少了数据库的访问次数。

下面是一个示例代码:

from django.contrib import admin
from .models import Author, Book

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', 'total_books')

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.select_related('book_set')

    def total_books(self, obj):
        return obj.book_set.count()
    total_books.short_description = 'Total Books'

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')

在上面的示例中,我们定义了两个模型类AuthorBookAuthor模型类有一个外键指向Book模型类。AuthorAdmin继承自admin.ModelAdmin,并定义了list_display属性和total_books方法。BookAdmin也继承自admin.ModelAdmin,并定义了list_display属性。

AuthorAdmin中,我们重写了get_queryset()方法,使用select_related('book_set')来查询关联的Book对象。这样,当在管理界面的作者列表视图中显示作者信息时,所有相关的书籍信息都会被一次性查询出来,避免了1+n个查询的问题。

最后,我们使用total_books方法来显示每个作者拥有的书籍总数,这里使用了obj.book_set.count()来获取每个作者的书籍数量。

通过使用select_related()方法,我们可以减少数据库的查询次数,提高查询性能。

相关内容

热门资讯

玩家交流((wepower德州... 玩家交流((wepower德州))外挂透明挂辅助工具(脚本辅助挂)一直真的有挂(可靠技巧)-知乎1、...
科技通报((aapOKER))... 科技通报((aapOKER))外挂透明挂辅助插件(脚本辅助挂)原来真的有挂(解密教程)-头条;1、系...
带你了解((wPk))外挂透明... 带你了解((wPk))外挂透明挂辅助黑科技(智能ai代打)本来真的有挂(细节方法)-今日头条1、操作...
分享一款((约局互娱))外挂透... 分享一款((约局互娱))外挂透明挂辅助挂(wpk辅助)一般真的有挂(2025新版教程)-头条;1、下...
揭秘攻略((AAPOKER))... 揭秘攻略((AAPOKER))外挂透明挂辅助器(黑科技辅助)原来真的有挂(科技教程)-今日头条;该软...
一分钟了解((wePOke))... 一分钟了解((wePOke))外挂透明挂辅助工具(透视辅助挂)就是真的有挂(详细教程)-头条1)辅助...
科普((聚星扑克))外挂透明挂... 科普((聚星扑克))外挂透明挂辅助工具(透视辅助挂)一般真的有挂(普及教程)-头条1、完成透视辅助安...
玩家必看攻略((WEPOke)... 玩家必看攻略((WEPOke))外挂透明挂辅助神器(德州辅助)的确是有挂的(解密教程)-小红书;1)...
今日公布((菠萝德州app))... 今日公布((菠萝德州app))外挂透明挂辅助APP(德州辅助)好像真的有挂(揭秘教程)-抖音1、全新...
玩家必备科普((aapOker... 玩家必备科普((aapOker))外挂透明挂辅助器(智能ai代打)一贯真的有挂(存在挂教程)-微博热...