给两个不同的Django自定义模型管理器赋予不同的名称?

时间:2015-02-19 22:18:37

标签: django django-models

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

我有一个CommonProfileInfo抽象类,它有一个自定义管理器,可以为我的非业务和业务用户保存地址。自定义管理器将包含一个“add_address”方法,我可以使用该方法更新继承自此抽象类的个人配置文件模型中的用户地址:

# 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

我还有两个模型类,其中包含我的业务和非业务用户的配置文件信息。它们还包含三个特定于Ge​​oDjango的字段:

# 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...

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

感谢。

1 个答案:

答案 0 :(得分:0)

Managers通常被认为是 Django 中的 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()