Django 在测试期间双重导入
Django double import during tests
每当我 运行 Django 测试时,我都会陷入模型的双重导入陷阱。
每次我得到
RuntimeError: Conflicting 'userdevice' models in application 'cart': <class 'cart.models.devices.UserDevice'> and <class 'fridge.libs.cart.models.devices.UserDevice'>
最小失败示例位于 https://www.dropbox.com/sh/m802q544cet5dui/AACRGOMQXWqxUzi92WfqfvYea?dl=0
我的文件夹结构是
.
├── apps
│ ├── __init__.py
│ └── milk
│ ├── __init__.py
│ └── tests
│ ├── __init__.py
│ └── test_commands.py
├── __init__.py
├── libs
│ ├── cart
│ │ ├── __init__.py
│ │ └── models
│ │ ├── devices.py
│ │ └── __init__.py
│ └── __init__.py
├── Makefile
├── manage.py
└── settings
├── __init__.py
└── settings.py
我在 INSTALLED_APPS
中有 apps
和 libs
个文件夹。
我的 models/__init__.py
文件包含
from .devices import *
来自 test_commands.py
我将模型包含在
from cart.models import UserDevice
我在 SO 和网络上的一些文章中阅读了多个问题。我也调试了几个小时,所以我知道问题是我的模型被导入了两次。一次在 Django 项目初始化期间作为 cart.models.devices.UserDevice
一次由 unittest
库初始化为 fridge.libs.cart.models.devices.UserDevice
但我根本不知道如何解决这种情况。
这也导致了更多的文件问题,在应用程序中只能初始化一次运行,但我想解决方案与此相同。
我正在使用 Django 1.10.8,因为这是一个遗留项目,但我在 Django 2.0.7 上也有同样的体验。
Python版本是3.5。 OS 是 Ubuntu 16.04.
感谢您的任何建议或提示。到目前为止我发现的一切都没有帮助。
编辑
所以我做了一些实验,即使在测试中没有导入,甚至根本没有测试,问题仍然存在。只需 运行 测试即可实现双重导入和 RuntimeError
发生
未测试版本:https://www.dropbox.com/sh/qqzg842rihbh5im/AADzay8up3d_rFKqy2OAsx1za?dl=0
新文件夹结构
.
├── __init__.py
├── libs
│ ├── cart
│ │ ├── __init__.py
│ │ └── models
│ │ ├── devices.py
│ │ └── __init__.py
│ └── __init__.py
├── Makefile
├── manage.py
└── settings
├── __init__.py
└── settings.py
编辑:
为了将来 - libs/cart/models/devices.py
的内容只是简单的 Django 模型 class
from django.db import models
class UserDevice(models.Model):
is_active = models.BooleanField(default=True)
class Meta:
app_label = 'cart'
我通过删除 libs/__init__.py
文件以某种方式 "solved" 解决了这个问题。我不确定为什么它首先出现在项目中。
每当我 运行 Django 测试时,我都会陷入模型的双重导入陷阱。
每次我得到
RuntimeError: Conflicting 'userdevice' models in application 'cart': <class 'cart.models.devices.UserDevice'> and <class 'fridge.libs.cart.models.devices.UserDevice'>
最小失败示例位于 https://www.dropbox.com/sh/m802q544cet5dui/AACRGOMQXWqxUzi92WfqfvYea?dl=0
我的文件夹结构是
.
├── apps
│ ├── __init__.py
│ └── milk
│ ├── __init__.py
│ └── tests
│ ├── __init__.py
│ └── test_commands.py
├── __init__.py
├── libs
│ ├── cart
│ │ ├── __init__.py
│ │ └── models
│ │ ├── devices.py
│ │ └── __init__.py
│ └── __init__.py
├── Makefile
├── manage.py
└── settings
├── __init__.py
└── settings.py
我在 INSTALLED_APPS
中有 apps
和 libs
个文件夹。
我的 models/__init__.py
文件包含
from .devices import *
来自 test_commands.py
我将模型包含在
from cart.models import UserDevice
我在 SO 和网络上的一些文章中阅读了多个问题。我也调试了几个小时,所以我知道问题是我的模型被导入了两次。一次在 Django 项目初始化期间作为 cart.models.devices.UserDevice
一次由 unittest
库初始化为 fridge.libs.cart.models.devices.UserDevice
但我根本不知道如何解决这种情况。
这也导致了更多的文件问题,在应用程序中只能初始化一次运行,但我想解决方案与此相同。
我正在使用 Django 1.10.8,因为这是一个遗留项目,但我在 Django 2.0.7 上也有同样的体验。
Python版本是3.5。 OS 是 Ubuntu 16.04.
感谢您的任何建议或提示。到目前为止我发现的一切都没有帮助。
编辑
所以我做了一些实验,即使在测试中没有导入,甚至根本没有测试,问题仍然存在。只需 运行 测试即可实现双重导入和 RuntimeError
发生
未测试版本:https://www.dropbox.com/sh/qqzg842rihbh5im/AADzay8up3d_rFKqy2OAsx1za?dl=0
新文件夹结构
.
├── __init__.py
├── libs
│ ├── cart
│ │ ├── __init__.py
│ │ └── models
│ │ ├── devices.py
│ │ └── __init__.py
│ └── __init__.py
├── Makefile
├── manage.py
└── settings
├── __init__.py
└── settings.py
编辑:
为了将来 - libs/cart/models/devices.py
的内容只是简单的 Django 模型 class
from django.db import models
class UserDevice(models.Model):
is_active = models.BooleanField(default=True)
class Meta:
app_label = 'cart'
我通过删除 libs/__init__.py
文件以某种方式 "solved" 解决了这个问题。我不确定为什么它首先出现在项目中。