给两个不同的 Django 自定义模型管理器起不同的名字?

Give different names to two different Django custom model managers?

我正在阅读 Django 关于 Custom managers and model inheritance 的文档,并试图弄清楚我是否会遇到以下代码的问题。

我有一个带有自定义管理器的 CommonProfileInfo 摘要 class,它将保存我的非企业和企业用户的地址。自定义管理器将包含一个 "add_address" 方法,我可以使用它来更新继承自此抽象 class:

的个人资料模型中的用户地址
# models.py
class CommonProfileInfoManager(models.Manager):

    def add_address(self, address):
        # Update user's address in PersonalProfile
        pass

class CommonProfileInfo(models.Model):
    user = models.OneToOneField(User, primary_key=True, unique=True)
    # ...
    address_line = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    # ...

    objects = CommonProfileInfoManager()

    class Meta:
        abstract = True

我还有两个模型 classes,其中包含我的企业用户和非企业用户的个人资料信息。它们还包含三个 GeoDjango 特定字段:

# models.py
class PersonalProfile(CommonProfileInfo):
    # Other personal fields...

    # GeoDjango-specific fields 
    home_point = models.PointField(srid=4326)
    current_point = models.PointField(srid=4326)
    objects = models.GeoManager()        
    # More fields...

class BusinessProfile(CommonProfileInfo):
    # Other business-specific fields...

    # GeoDjango-specific fields 
    home_point = models.PointField(srid=4326)
    current_point = models.PointField(srid=4326)
    objects = models.GeoManager()
    # More fields...

我是否正确声明了这四个 class?更具体地说,我的 GeoDjango 特定数据库代码和查询是否会停止工作,因为我在 CommonProfileInfo 和 Personal- 和 BusinessProfile classes 中都声明了一个名称为 "objects" 的管理器?我是否需要将两个配置文件 classes 中的 "objects" 声明更改为 "default_manager = models.GeoManager",如文档中所示?我应该将我的 GeoDjango 特定字段移动到摘要 class 中吗?但是,如果我这样做,那 "objects" 声明不会与我已经存在的 CommonProfileInfoManager 对象声明冲突吗?正确的做法是什么?

谢谢。

ManagersDjango 中通常被认为是 Singleton 实例。但是,您可以声明多个 Managers 如果它使您的代码比对单个 Manager 使用 继承 更易于维护。如果你想要多个 Managers,你可以像这样创建它们:

class BusinessProfile(CommonProfileInfo):
    # model fields
    objects = CommonProfileInfoManager()
    objects_geo = GeoManager()

现在,您可以同时使用这两个 Managers Model,如下所示:

BusinessProfile.objects.custom_profile_method()

BusinessProfile.objects_geo.custom_geo_method()