DRF 视图是否使用其查询集的对象管理器?
Do DRF views use its queryset's object manager?
如果我有一个带有自定义 create
模型函数的自定义对象管理器:
class CustomManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(custom=True)
def create(self):
kwargs["custom"] = True
return super().create(**kwargs)
class Item(models.Model):
customs = CustomManager()
custom = BooleanField()
...
然后我使用该自定义管理器作为视图的查询集:
class ItemViewSet(views.ModelViewSet):
queryset = Item.customs.all()
ItemViewSet
的 create/post 函数会自动应用我的自定义对象管理器的 kwargs["custom"] = True
吗?
ModelViewSet
s 上的创建由 serializer_class
处理,正如在 CreateModelMixin
上看到的那样,更新也一样 - 调用 serializer.save()
。
假设您使用的是简单的 ModelSerializer
,这就是在创建对象的 serializer.save()
上调用的内容:
instance = ModelClass._default_manager.create(**validated_data)
因此它将使用您模型的 _default_manager
,according to the docs 将是在 class 上声明的第一个管理器 - 因此理论上它应该是您的自定义管理器.
顺便说一句,我强烈建议您在遇到此类情况时仔细阅读 DRF 的代码。该代码非常简单易懂。像 Classy Django REST Framework
这样的网站可以让浏览代码变得更加容易。
如果我有一个带有自定义 create
模型函数的自定义对象管理器:
class CustomManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(custom=True)
def create(self):
kwargs["custom"] = True
return super().create(**kwargs)
class Item(models.Model):
customs = CustomManager()
custom = BooleanField()
...
然后我使用该自定义管理器作为视图的查询集:
class ItemViewSet(views.ModelViewSet):
queryset = Item.customs.all()
ItemViewSet
的 create/post 函数会自动应用我的自定义对象管理器的 kwargs["custom"] = True
吗?
ModelViewSet
s 上的创建由 serializer_class
处理,正如在 CreateModelMixin
上看到的那样,更新也一样 - 调用 serializer.save()
。
假设您使用的是简单的 ModelSerializer
,这就是在创建对象的 serializer.save()
上调用的内容:
instance = ModelClass._default_manager.create(**validated_data)
因此它将使用您模型的 _default_manager
,according to the docs 将是在 class 上声明的第一个管理器 - 因此理论上它应该是您的自定义管理器.
顺便说一句,我强烈建议您在遇到此类情况时仔细阅读 DRF 的代码。该代码非常简单易懂。像 Classy Django REST Framework
这样的网站可以让浏览代码变得更加容易。