Django Admin面板新增模型时如何同步修改其他关联模型数据?
实现方案
首先需要补充两个模型的多对多关联字段,之后重写Keyword对应Admin的save_model方法即可,完全基于原生Admin能力实现,不需要自定义视图。
步骤1:修改模型代码补充关联字段
给Keyword和Product添加双向多对多关联,修改你的models.py如下:
from django.db import models class Product(models.Model): id = models.BigAutoField(primary_key=True) product_summary = models.TextField() # 存储产品描述的段落文本 class Keyword(models.Model): # 关键词设为unique避免重复创建,可根据需求调整 keyword = models.CharField(max_length=100, unique=True) # 新增多对多关联,一个关键词对应多个产品,一个产品对应多个关键词 products = models.ManyToManyField(Product, related_name="keywords", blank=True)
修改完成后执行python manage.py makemigrations和python manage.py migrate完成表结构更新。
步骤2:重写Admin保存逻辑
在对应app的admin.py中添加如下代码:
from django.contrib import admin from .models import Product, Keyword @admin.register(Keyword) class KeywordAdmin(admin.ModelAdmin): # 重写原生保存方法,注入自定义关联逻辑 def save_model(self, request, obj, form, change): # 先执行默认保存逻辑,将新增关键词存入数据库 super().save_model(request, obj, form, change) # 仅新增关键词时执行关联逻辑,修改已有关键词不需要可保留此行 if not change: # 查询所有产品描述包含当前关键词的产品 matched_products = Product.objects.filter(product_summary__icontains=obj.keyword) # 批量关联到当前关键词 obj.products.add(*matched_products) # 可选:注册Product模型,方便直接查看产品关联的关键词 @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('id', 'product_summary') filter_horizontal = ('keywords',) # 可视化管理多对多关联
可选调整说明
- 若需要区分关键词的大小写匹配,将查询条件中的
icontains改为contains即可 - 若修改已有关键词时也需要重新同步关联的产品,删除
if not change:判断即可 - 若不需要在Product的Admin页管理关联关键词,可省略ProductAdmin的注册代码
内容的提问来源于stack exchange,提问作者bqi138
相关产品推荐
相关产品推荐

