Django 模型外键字段在测试期间的迁移中不可用

Posted

技术标签:

【中文标题】Django 模型外键字段在测试期间的迁移中不可用【英文标题】:Django model foreign key field is not available in migrations during tests 【发布时间】:2021-08-06 10:35:02 【问题描述】:

我有这个模型。

class TransportOrder(SomeMixin, models.Model):
    order = models.ForeignKey(
        to="orders.Order",
        on_delete=models.PROTECT,
        related_name="transport_orders",
        help_text=_("Order which was used for creating"),
        null=True,
        blank=True,
    )
    # Other fields have been removed for simplicity

我在迁移中有转发功能。

def forward(apps, schema_editor):
    TransportOrder = apps.get_model("transportorders", "TransportOrder")
    
    # There is no `order` field printed result.
    print(dir(TransportOrder))

    # I need to filter something by using `TransportOrder.order` foreign key field here. But I receive the error obviously.

由于apps.get_model函数提供的TransportOrder模型中没有order字段,所以出现以下错误。

django.core.exceptions.FieldError: Cannot resolve keyword 'order' into field.

但是,这只发生在运行我的测试时。否则没有问题。什么可能导致此问题?

【问题讨论】:

你跑manage.py migrate了吗? 是的,我确实运行了它。 “这只发生在运行我的测试时”,你如何运行你的测试?如果问题出在您的测试中,您还应该将该代码添加到问题中。 您是否尝试过从 django shell 导入 TransportOrder 并检查是否有可用的订单字段? @blondelg 是的,我试过了,是的。 【参考方案1】:

尝试使用 django 测试工具,它旨在与项目完美配合,尤其是数据库和模型。

每次运行测试时,Django 都会构建它自己的测试数据库,您可以使用项目中的对象从测试中填充。

https://docs.djangoproject.com/en/3.2/topics/testing/

【讨论】:

嗯,谢谢你的建议。肯定会看看它,但改变我们当前的工具是不可能的。因为它在我们所有的项目中都被广泛使用。【参考方案2】:

显然,makemigration 创建的 dependencies=[] 在某些旧迁移中不正确。

在某些迁移中手动添加一些依赖项解决了问题。

【讨论】:

以上是关于Django 模型外键字段在测试期间的迁移中不可用的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.9 在迁移中删除外键

如何在南迁移期间调用 django 模型类的静态方法

如何在表单完成期间设置外键(python/django)

在测试期间更改 Django 迁移应用程序的顺序

Django迁移RunPython无法调用模型方法

如何在Django中基于枚举为模型字段设置默认值?