You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Admin新增Book时同步更新关联Authors的total_books字段

Django Admin新增Book时自动更新作者total_books字段的解决方案

下面提供两种实用的实现方式,可根据你的需求场景选择:

方法一:重写BookAdmin的save_model方法

这种方式仅针对Admin后台操作生效,逻辑直观,适合只需要在Admin中处理统计更新的场景。

在项目的admin.py中添加以下代码:

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

class BookAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # 仅当新增Book记录时触发(change为False表示是新增操作)
        if not change:
            obj.author.total_books += 1
            obj.author.save()
        # 调用父类方法完成Book对象的保存
        super().save_model(request, obj, form, change)

# 注册自定义的Book管理类
admin.site.register(Book, BookAdmin)
admin.site.register(Authors)

方法二:使用Django post_save信号

这种方式全局生效,不管是通过Admin、API还是Django Shell新增Book,都会自动触发统计更新,通用性更强。

在项目的models.py中添加以下代码:

from django.db.models.signals import post_save
from django.dispatch import receiver

# 监听Book模型的保存事件
@receiver(post_save, sender=Book)
def update_author_total_books(sender, instance, created, **kwargs):
    # created为True表示当前是新增的Book记录
    if created:
        instance.author.total_books += 1
        instance.author.save()

额外注意事项

  1. 批量新增场景:如果使用Book.objects.bulk_create()批量新增书籍,post_save信号不会触发,需要手动统计并更新作者的total_books字段。
  2. 编辑Book切换作者:如果需要支持编辑Book时更换作者,同步调整新旧作者的书籍统计数,可以在save_model中补充逻辑:
def save_model(self, request, obj, form, change):
    if change:
        # 检查编辑时是否修改了作者字段
        if 'author' in form.changed_data:
            # 原作者书籍数减1
            old_author = Authors.objects.get(pk=form.initial['author'])
            old_author.total_books -= 1
            old_author.save()
            # 新作者书籍数加1
            obj.author.total_books += 1
            obj.author.save()
    else:
        obj.author.total_books += 1
        obj.author.save()
    super().save_model(request, obj, form, change)

内容的提问来源于stack exchange,提问作者Siyuan Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:13:27