Django重写save方法实现字段值自动同步的问题求助
Django模型save方法重写实现分类自动关联
问题说明
当为Product模型的to_category字段选择单个分类并保存时,需自动将该分类同步添加到to_categories多对多字段中。
实现方案
修改Product模型的save方法即可实现需求,核心注意点:
- 必须先调用父类
save()方法,多对多字段需要实例已存入数据库才能操作 - 避免重复添加同一分类到
to_categories中 - 兼容
to_category为null的场景
修改后的完整模型代码如下:
from django.db import models from django.core.validators import MinLengthValidator class Category(models.Model): name = models.CharField(max_length=255, validators=[MinLengthValidator(3)]) parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE ) class Product(models.Model): name = models.CharField(max_length=255, validators=[MinLengthValidator(3)]) to_category = models.ForeignKey(Category, on_delete=models.SET_NULL, blank=True, null=True, ) to_categories = models.ManyToManyField(Category, blank=True, related_name='categories', ) def save(self, *args, **kwargs): # 先保存实例,确保多对多字段可操作 super().save(*args, **kwargs) # 若to_category有值,且未在to_categories中则添加 if self.to_category: if not self.to_categories.filter(id=self.to_category.id).exists(): self.to_categories.add(self.to_category)
补充说明
- Django的
add方法本身会忽略已存在的关联对象,显式判断是否存在可减少不必要的数据库查询 - 若需要在
to_category变更时,移除旧分类的关联,可以在保存前记录旧值,保存后对比并执行移除操作
内容的提问来源于stack exchange,提问作者Vitalii Lastname
相关产品推荐
相关产品推荐

