给两个不同的 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 对象声明冲突吗?正确的做法是什么?
谢谢。
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()
我正在阅读 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 对象声明冲突吗?正确的做法是什么?
谢谢。
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()