现在有两个表,一个是 主题 表,另一个是 视频 表,二者是多对多关系,现在我想在主题表新建一个记录时,把关联的视频数量也统计上,该怎么做?
- 在 主题 表中定义一个 视频数量 字段,用以存放统计数据。
- 在 admin.py 中 主题 表对应的ModelAdmin下重载 save_model 方法。 如下:
1
2
3
4def save_model(self, request, obj, form, change): obj.video_num = obj.theme_video.count() if change else len(dict(request.POST)['theme_video']) super().save_model(request, obj, form, change)
提示:在第一次创建时,即 change 为 False,此时 obj.theme_video 会报错,因为此时 obj 对象还未创建(主要是主题表的主键还未生成,假如主键已创建的情况则忽略此提示),二者还未创建 多对多 关系。经过调试发现,关联的视频的 id 以 list 形式保存在 post 参数中,故读取 list 长度即可得知关联的视频数量。
现在有 一个 视频表,一个视频评论表。二者独立关系。现在想删除评论后同步减少视频表中评论统计数量。
对于 批量删除 记录并执行其他操作,此时表默认的批量删除已不满足需求,可以采用给表 自定义动作(action)的方式。添加 自定义动作,有两种方式,如下:
- 把 函数 写到类外部,然后 添加到 类的 actions属性中,
注意:
此时 函数名 并没有加 引号。 ```python from django.contrib import admin from myapp.models import Article
def make_published(modeladmin, request, queryset): queryset.update(status=’p’) make_published.short_description = “Mark selected stories as published”
class ArticleAdmin(admin.ModelAdmin): list_display = [‘title’, ‘status’] ordering = [‘title’] actions = [make_published]
admin.site.register(Article, ArticleAdmin)
1 |
|
官方文档 - Admin actions
在 Admin 后台 编辑主表及内联表。并控制内联表的额外显示行数(默认多出3行)
1 |
|
代码中 OneLevelCategory 为主表,TwoLevelCategory 为内联表。若在 admin 后台编辑,内联表 需定义在主表前。