使用django-model-utils自动降级到子类

2 投票
1 回答
1111 浏览
提问于 2025-04-18 15:45

我有多个用户模型,它们都继承自一个基础模型,并且有一个自定义的管理器。

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 就可以了。

撰写回答