Django 2.0后台:执行自定义动作时删除关联模型记录
解决Django Admin自定义动作同时删除关联模型记录的问题
没问题,你只需要在现有的自定义动作里添加删除关联ArbitraseRecord的逻辑即可,具体实现取决于你两个模型之间的关联方式,下面是最常见的两种场景:
场景1:ArbitraseRecord通过ForeignKey关联WallmartRecord
假设你的ArbitraseRecord模型定义了指向WallmartRecord的外键,直接用批量删除的方式就能高效处理:
# 先导入需要的模型 from .models import WallmartRecord, ArbitraseRecord def clear_arbitrase(modeladmin, request, queryset): # 第一步:批量删除选中WallmartRecord对应的所有ArbitraseRecord # 把`wallmart_record`替换成你ArbitraseRecord中外键字段的实际名称 ArbitraseRecord.objects.filter(wallmart_record__in=queryset).delete() # 第二步:更新选中记录的arbitrase_generated字段为False queryset.update(arbitrase_generated=False) @admin.register(WallmartRecord) class WallmartRecordAdmin(admin.ModelAdmin): actions = [ clear_arbitrase ]
场景2:ArbitraseRecord通过OneToOneField关联WallmartRecord
如果是一对一关联,逻辑和上面几乎一致,只需保证过滤条件匹配你的字段名:
def clear_arbitrase(modeladmin, request, queryset): # 替换`wallmart_record`为你OneToOneField的实际字段名 ArbitraseRecord.objects.filter(wallmart_record__in=queryset).delete() queryset.update(arbitrase_generated=False)
关键注意事项
- 字段名替换:一定要把代码里的
wallmart_record换成你ArbitraseRecord模型中真实的关联字段名称(比如外键叫wm_record,就写成wm_record__in=queryset)。 - 批量操作更高效:用
filter(xxx__in=queryset).delete()比遍历每个WallmartRecord对象再删关联记录高效得多,它只会执行一条SQL删除语句。 - on_delete参数不生效:这里不能依赖外键的
on_delete参数(比如CASCADE),因为我们并没有删除WallmartRecord,只是更新它的字段,所以必须手动触发关联记录的删除。
内容的提问来源于stack exchange,提问作者Anuj TBE
相关产品推荐
相关产品推荐

