如何修改ModelSerializer默认模型管理器?求无需重写父类方法的方案
问题描述
给定以下Django代码片段:
class CustomManager(models.Manager): def create(**kwargs): super().create(external_id='xyz', **kwargs) class Person(models.Model): internal_id = models.AutoField(db_column='id', primary_key=True) f_name=models.CharField(db_column='f_name', max_length=15, blank=True, null=True) external_id = models.CharField(db_column='ext_id', null=True, blank=True, max_length=20) objects = models.Manager() custom = CustomManager() class PersonSerializer(serializers.ModelSerializer): class Meta: model=Person fields='__all__'
调用该Serializer的save()方法时,默认使用objects模型管理器执行创建操作。希望改为使用custom管理器触发CustomManager中的create方法,且不想通过重写Serializer父类的create方法实现,询问是否有更优方案。
解决方案
有两种无需重写Serializercreate方法的可行方案:
方案1:调用save()时显式指定管理器
Django REST Framework的save()方法支持传入manager参数,直接指定要使用的模型管理器即可:
serializer = PersonSerializer(data=request.data) if serializer.is_valid(): serializer.save(manager=Person.custom)
这样创建实例时就会触发CustomManager中的create方法。
方案2:将custom设为模型的默认管理器
如果希望该模型的所有默认创建逻辑都使用custom管理器,可以调整模型内管理器的定义顺序,把custom放在objects之前(Django会将模型中第一个定义的管理器作为默认管理器):
class Person(models.Model): internal_id = models.AutoField(db_column='id', primary_key=True) f_name=models.CharField(db_column='f_name', max_length=15, blank=True, null=True) external_id = models.CharField(db_column='ext_id', null=True, blank=True, max_length=20) custom = CustomManager() # 排在前面,成为默认管理器 objects = models.Manager()
如果不需要保留原objects管理器,也可以直接替换:
class Person(models.Model): # 字段定义不变 objects = CustomManager() # 直接将自定义管理器设为默认
修改后,Serializer默认就会使用custom管理器执行创建操作。
内容的提问来源于stack exchange,提问作者Ravish Mallya
相关产品推荐
相关产品推荐

