覆盖第三方应用 (Django) default_manager
Override default_manager of third party app (Django)
我在我的项目中使用 django-address 模块 (https://pypi.org/project/django-address/)。现在我想在 django-address
模块的 State
模型的默认管理器上添加 get_by_natural_key
方法。
在 Django 1.10 之前,我可以使用这段代码来做到这一点
class CustomManager(models.Manager):
def get_by_natural_key(self, state_name, country):
country = Country.objects.get_or_create(name=country)[0]
print(country)
return State.objects.get_or_create(name=state_name, country=country)[0]
State.add_to_class('objects', CustomManager())
State.add_to_class('_default_manager', CustomManager())
但是从 Django1.10 开始,_default_manager
是只读的,我不确定如何在模型
的默认管理器上添加 'get_by_natural_key' 方法
我不建议覆盖 Django 不希望您覆盖的内容,但如果您仍然想这样做,您可以直接在 Meta 中覆盖 default_manager
。
setattr(State._meta, 'default_manager', CustomManager())
我在我的项目中使用 django-address 模块 (https://pypi.org/project/django-address/)。现在我想在 django-address
模块的 State
模型的默认管理器上添加 get_by_natural_key
方法。
在 Django 1.10 之前,我可以使用这段代码来做到这一点
class CustomManager(models.Manager):
def get_by_natural_key(self, state_name, country):
country = Country.objects.get_or_create(name=country)[0]
print(country)
return State.objects.get_or_create(name=state_name, country=country)[0]
State.add_to_class('objects', CustomManager())
State.add_to_class('_default_manager', CustomManager())
但是从 Django1.10 开始,_default_manager
是只读的,我不确定如何在模型
我不建议覆盖 Django 不希望您覆盖的内容,但如果您仍然想这样做,您可以直接在 Meta 中覆盖 default_manager
。
setattr(State._meta, 'default_manager', CustomManager())