在自定义迁移中将模型导入为 `apps.get_model('app_name', 'ModelName')` 的逻辑是什么
Whats the logic of importing models as `apps.get_model('app_name', 'ModelName')` in a custom migration
我问这个问题是因为当我使用 django-hordak 时,我 运行 进入了这个 django.db.utils.IntegrityError: null value in column “lft” violates not-null constraint,它使用 MPPT 模型.
提出的一些解决方案是 hacky
,因为它们违背了通常的做法,但它们确实有效。
基础知识
在 Django 中编写自定义迁移时,例如在创建基线数据时。
def forward_func(apps_registry, schema_editor):
Model = apps_registry.get_model('app_name', 'ModelName')
Model.objects.create(**{'field_1': 'field_1', 'field_2': 'field_2')
# Do whatever you want with my Model
在我的情况下,django-hordak 具有帐户模型。如上所述 .objects.create(**data)
raises the
DB 上的 IntegrityError。
建议的解决方案
建议的解决方案之一是直接导入模型。
def forward_func(apps_registry, schema_editor):
# Model = apps_registry.get_model('app_name', 'ModelName')
# lets forget about importing the standard way because it will raise integrity error.
from app_name.models import ModelName as Model
# Now we can proceed to deal with our model without Integrity Error.
Model.objects.create(**data)
这让我害怕直接在迁移文件中导入模型可能产生的不良副作用。
在迁移文件中没有以这种方式导入模型一定有很好的理由。
我不是在寻找 MPTT 模型在以标准方式导入时失败的原因,因为该问题有一个 。 .
我想特别了解在迁移文件中使用 apps.get_model
导入模型背后的逻辑。
这个问题问得很好,确实有很大的不同。
如果导入模型,您将获得模型代码中当前定义的任何内容。但是如果你想删除一个模型会发生什么?您如何确保您的迁移仍然有效?
这就是 apps.get_model
的原因。它将根据先前迁移定义的状态为您提供 "virtual" 模型。请注意,这与代码中的模型不同。它没有您实现的任何自定义函数和行为,除非它们是 ORM API 的一部分。换句话说,主要是字段和元选项,如排序和 co.
另请注意,正确的签名是 apps
而不是 app_registry
。它不应与 django.apps.apps
中的应用注册表相混淆。它也有一个 get_model
方法。然而,这个将 return 您当前代码中的模型。
我知道一开始(甚至后来)可能有点混乱。我建议遵循一个简单的规则。 不要将您自己的任何代码导入迁移。如果必须,将行为反向移植到迁移中。
希望以上区别对您有所帮助。如果您还有其他问题,请给我留言。我很乐意扩展我的答案。
最佳
-乔
我问这个问题是因为当我使用 django-hordak 时,我 运行 进入了这个 django.db.utils.IntegrityError: null value in column “lft” violates not-null constraint,它使用 MPPT 模型.
提出的一些解决方案是 hacky
,因为它们违背了通常的做法,但它们确实有效。
基础知识
在 Django 中编写自定义迁移时,例如在创建基线数据时。
def forward_func(apps_registry, schema_editor):
Model = apps_registry.get_model('app_name', 'ModelName')
Model.objects.create(**{'field_1': 'field_1', 'field_2': 'field_2')
# Do whatever you want with my Model
在我的情况下,django-hordak 具有帐户模型。如上所述 .objects.create(**data)
raises the
DB 上的 IntegrityError。
建议的解决方案
建议的解决方案之一是直接导入模型。
def forward_func(apps_registry, schema_editor):
# Model = apps_registry.get_model('app_name', 'ModelName')
# lets forget about importing the standard way because it will raise integrity error.
from app_name.models import ModelName as Model
# Now we can proceed to deal with our model without Integrity Error.
Model.objects.create(**data)
这让我害怕直接在迁移文件中导入模型可能产生的不良副作用。
在迁移文件中没有以这种方式导入模型一定有很好的理由。
我不是在寻找 MPTT 模型在以标准方式导入时失败的原因,因为该问题有一个 apps.get_model
导入模型背后的逻辑。
这个问题问得很好,确实有很大的不同。
如果导入模型,您将获得模型代码中当前定义的任何内容。但是如果你想删除一个模型会发生什么?您如何确保您的迁移仍然有效?
这就是 apps.get_model
的原因。它将根据先前迁移定义的状态为您提供 "virtual" 模型。请注意,这与代码中的模型不同。它没有您实现的任何自定义函数和行为,除非它们是 ORM API 的一部分。换句话说,主要是字段和元选项,如排序和 co.
另请注意,正确的签名是 apps
而不是 app_registry
。它不应与 django.apps.apps
中的应用注册表相混淆。它也有一个 get_model
方法。然而,这个将 return 您当前代码中的模型。
我知道一开始(甚至后来)可能有点混乱。我建议遵循一个简单的规则。 不要将您自己的任何代码导入迁移。如果必须,将行为反向移植到迁移中。
希望以上区别对您有所帮助。如果您还有其他问题,请给我留言。我很乐意扩展我的答案。
最佳 -乔