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 博客时它应该是可编辑的。
尝试覆盖 ModelAdmin
、docs link
返回的默认查询集
class BlogAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request).defer('content')
return qs
我有以下配置:
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 博客时它应该是可编辑的。
尝试覆盖 ModelAdmin
、docs link
class BlogAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request).defer('content')
return qs