Django admin:排除列表中的字段但不排除编辑中的字段

Django admin: Exclude fields in listing but not in editing

我有以下配置:

class Blog(models.Model):
    title = models.CharField('Title', max_length=1024, blank=False, null=False)
    author = models.CharField('Author', max_length=1024, blank=False, null=False)
    language = models.CharField('Language', max_length=25, blank=False, null=False)
    content = models.TextField('Content', blank=True, null=True)
    is_active = models.BooleanField('Active', blank=False, null=False, default=True)

    class Meta:
        managed = False
        db_table = 'blog'
        verbose_name_plural = "Blogs"


class BlogAdmin(admin.ModelAdmin):
    model = Blog
    list_display = ('title', 'author', 'language', 'is_active')
    search_fields = ('title', 'author', 'language')

    def has_delete_permission(self, request, obj=None):
        return False


admin.site.register(Blog, BlogAdmin)

content 字段是 TextField 并且很大(最多 200kb)。

list_display选项里,我没有加content也是一样的原因。但是,列表页面上的 SQL 查询获取所有字段,然后显示选中。

SQL 查询(分页):

SELECT COUNT(*) AS `__count` FROM `blog`;
SELECT `blog`.`id`, `blog`.`title`, `blog`.`author`, `blog`.`language`, `blog`.`content`, `blog`.`is_active` FROM `blog` ORDER BY `blog`.`id` DESC LIMIT 100 OFFSET 500;

SQL 查询(搜索):

SELECT COUNT(*) AS `__count` FROM `blog` WHERE (`blog`.`title` LIKE '%search_query%' OR `blog`.`author` LIKE '%search_query%' OR `blog`.`language` LIKE '%search_query%');
SELECT COUNT(*) AS `__count` FROM `blog`;
SELECT `blog`.`id`, `blog`.`title`, `blog`.`author`, `blog`.`language`, `blog`.`content`, `blog`.`is_active` FROM `blog` WHERE (`blog`.`title` LIKE '%search_query%' OR `blog`.`author` LIKE '%search_query%' OR `blog`.`language` LIKE '%search_query%') ORDER BY `blog`.`id` DESC LIMIT 100;

问题是查询变得更慢(有时会超时),因为它每次都在获取 content 字段,即使它在列表页面中不是必需的。

我不需要在列表页面中选择 content 字段,但在 adding/editing 博客时它应该是可编辑的。

尝试覆盖 ModelAdmindocs link

返回的默认查询集
class BlogAdmin(admin.ModelAdmin):

    def get_queryset(self, request):
        qs = super().get_queryset(request).defer('content')
        return qs