使用django-model-utils自动降级到子类
我有多个用户模型,它们都继承自一个基础模型,并且有一个自定义的管理器。
models.py
class BaseUser(models.Model):
[...]
objects = UserManager()
class StaffUser(BaseUser):
[...]
class Customer(BaseUser):
[...]
managers.py
from model_utils.managers import InheritanceManager
class UserManager(..., InheritanceManager):
[...]
通过从django-model-utils中继承InheritanceManager,我可以对继承的模型进行自动类型转换。举个例子,如果我有三个对象,每个对象代表一种用户类型:
user = BaseUser.objects.select_subclasses()
[Customer: customer@example.com, BaseUser: studio@example.com, StaffUser: staff@example.com]
为了实现这个功能,我必须明确调用.select_subclasses()
,
但我希望能够自动进行类型转换,而不需要每次都调用.select_subclasses()
。
所以我尝试了:
class UserManager(..., InheritanceManager):
def get_queryset(self, *args, **kwargs):
queryset = super(UserManager, self).get_queryset()
return queryset.get_subclass(*args, **kwargs)
但是现在当我尝试使用:
user = EmailUser.objects.all()
我得到了这个错误:
MultipleObjectsReturned: get() returned more than one BaseUser -- it returned 3!
使用django-model-utils,是否可以对继承的模型进行自动类型转换?
1 个回答
1
我搞明白了!
managers.py
from model_utils.managers import InheritanceQuerySet
class UserManager([...]):
def get_queryset(self):
return InheritanceQuerySet(self.model).select_subclasses()
我不需要去继承 InheritanceManager
,而是直接使用 InheritanceQuerySet
就可以了。