Django pytest在创建数据库之前执行代码
在Django pytest在创建数据库之前执行代码,django,pytest,Django,Pytest,在AdminForm中,我防止用户复制记录。 from django import forms from django.contrib.auth.models import User from apps.accounting_users.models import AccountingUser from apps.marketing_users.models import MarketingUser from apps.mgmt_users.models import ManagementUs
AdminForm
中,我防止用户复制记录。
from django import forms
from django.contrib.auth.models import User
from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser
from apps.serv_mgrs_users.models import ServiceMgmtUser
from apps.serv_staff_users.models import ServiceStaffUser
class BaseDjangoAdminRoleForm(forms.ModelForm):
user = forms.ModelChoiceField(
queryset=User.objects.exclude(
username__in=[record.user.username for record in AccountingUser.objects.all()] +
[record.user.username for record in MarketingUser.objects.all()] +
[record.user.username for record in ManagementUser.objects.all()] +
[record.user.username for record in ServiceMgmtUser.objects.all()] +
[record.user.username for record in ServiceStaffUser.objects.all()],
)
)
管理用户/型号.py
from apps.commons.models import AbstractSBrandUser
class ManagementUser(AbstractSBrandUser):
pass
通用/模型
class AbstractSBrandUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
branch = models.ForeignKey(Branch, on_delete=models.SET_NULL, null=True)
mobile = models.CharField(max_length=15)
class Meta:
abstract = True
OSX 10.12.4 pytest正常黛比安:杰西坏了
File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/apps.py", line 23, in ready
self.module.autodiscover()
File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/__init__.py", line 26, in autodiscover
autodiscover_modules('admin', register_to=site)
File "/usr/local/lib/python3.6/site-packages/django/utils/module_loading.py", line 50, in autodiscover_modules
import_module('%s.%s' % (app_config.name, module_to_search))
File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 978, in _gcd_import
File "<frozen importlib._bootstrap>", line 961, in _find_and_load
File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
File "/buddy/siam-sbrand/portal/apps/mgmt_users/admin.py", line 3, in <module>
from apps.commons.forms import BaseDjangoAdminRoleForm
File "/buddy/siam-sbrand/portal/apps/commons/forms.py", line 11, in <module>
class BaseDjangoAdminRoleForm(forms.ModelForm):
File "/buddy/siam-sbrand/portal/apps/commons/forms.py", line 17, in BaseDjangoAdminRoleForm
[record.user.username for record in ServiceMgmtUser.objects.all()] +
File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 256, in __iter__
self._fetch_all()
File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 1087, in _fetch_all
文件“/usr/local/lib/python3.6/site packages/django/contrib/admin/apps.py”,第23行,准备就绪
self.module.autodiscover()
自动发现中的文件“/usr/local/lib/python3.6/site packages/django/contrib/admin/_init__.py”,第26行
自动发现模块('admin',register\u to=站点)
文件“/usr/local/lib/python3.6/site packages/django/utils/module_load.py”,第50行,在自动发现_模块中
导入模块(“%s.%s%”(app\u config.name,模块到搜索))
文件“/usr/local/lib/python3.6/importlib/_init__uuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第978行,在_gcd_import中
文件“”,第961行,在“查找”和“加载”中
文件“”,第950行,在“查找”和“加载”中解锁
文件“”,第655行,已加载
exec_模块中第678行的文件“”
文件“”,第205行,在调用中删除了帧
文件“/buddy/siam sbrand/portal/apps/mgmt_users/admin.py”,第3行,在
从apps.commons.forms导入BasedjangAdminRoleForm
文件“/buddy/siam sbrand/portal/apps/commons/forms.py”,第11行,在
基于类的AngoAdminRoleForm(forms.ModelForm):
BasedjangAdminroleForm中的文件“/buddy/siam sbrand/portal/apps/commons/forms.py”,第17行
[ServiceMgmtUser.objects.all()中记录的record.user.username]+
文件“/usr/local/lib/python3.6/site packages/django/db/models/query.py”,第256行,在__
self._fetch_all()
文件“/usr/local/lib/python3.6/site packages/django/db/models/query.py”,第1087行,在“fetch\u all”中
问题:我已经检查了基于
python3
的语法。我已经检查了
Django1.10
的filter
语法。python manage.py shell
运行正常。完全没有错误。如何在Django的
AdminForm
中使用queryset并通过测试?
是否需要取消此功能的测试?您不能在模型表单定义中使用类似于
[record.user.username for record in AccountingUser.objects.all()]
的查询集。Django尝试在加载模块时计算queryset。如果尚未创建表,则会出现错误
您可以通过在\uuuu init\uuuu
方法中设置queryset来解决此问题
class BaseDjangoAdminRoleForm(forms.ModelForm):
user = forms.ModelChoiceField(queryset=User.objects.none())
def __init__(self, *args, **kwargs):
super(BaseDjangoAdminRoleForm, self).__init__(*args, **kwargs)
self.fields['user'].queryset = User.objects.exclude(...)
这样做的好处是每次创建表单时都要计算用户名-目前,服务器启动时只计算一次用户名。在模型表单定义中不能使用类似于
[record.user.username for record in AccountingUser.objects.all()]
的查询集。Django尝试在加载模块时计算queryset。如果尚未创建表,则会出现错误
您可以通过在\uuuu init\uuuu
方法中设置queryset来解决此问题
class BaseDjangoAdminRoleForm(forms.ModelForm):
user = forms.ModelChoiceField(queryset=User.objects.none())
def __init__(self, *args, **kwargs):
super(BaseDjangoAdminRoleForm, self).__init__(*args, **kwargs)
self.fields['user'].queryset = User.objects.exclude(...)
这样做的好处是,每次创建表单时都会对用户名进行评估—目前,服务器启动时只对用户名进行一次评估。您是否在测试之前尝试过预填充测试数据库?是,我有
conftest.py
,它们包含带有@pytest.fixture
的multple函数,但自从我使用queryset
添加了AdminForm
以来,它们从来都不是问题。如果我将其设置为User.objects.all()
。pytest还可以。知道吗?当你运行测试时,django会创建一个新的空数据库。您需要在测试中填充它。在本例中,User.objects.all()不返回任何内容。我从未使用过Pytest(因此我不知道Pytest对fixture做了什么),但我使用过Django,而且由于测试数据库为空,我也遇到了问题。我有测试,我必须调用fixture
来测试我的所有API。这次它不是一个API,而是AdminForm
我没有任何关于这类的测试。那么我完全是空白为什么queryset会引发错误在测试之前您是否尝试过预填充测试数据库?是的,我有conftest.py
,它们包含带有@pytest.fixture
的多功能,但它们从来都不是问题,因为我使用queryset
添加了AdminForm
。如果我将其设置为User.objects.all()
。pytest还可以。知道吗?当你运行测试时,django会创建一个新的空数据库。您需要在测试中填充它。在本例中,User.objects.all()不返回任何内容。我从未使用过Pytest(因此我不知道Pytest对fixture做了什么),但我使用过Django,而且由于测试数据库为空,我也遇到了问题。我有测试,我必须调用fixture
来测试我的所有API。这次它不是一个API,而是AdminForm
我没有任何关于这类的测试。那么我完全不知道为什么queryset会引起一个错误非常感谢。我从来不知道这种技巧。你怎么知道这个解决方案?我将来可以用什么主题来防止这个bug呢?在\uuuu init\uuuu
方法中设置查询集是一种非常常见的技术,我不确定是从哪里学来的。通过确保不在模块级别执行任何数据库查询,可以避免类似的错误。这意味着将查询集移动到视图/表单方法中。我对表单非常陌生。让我确认我对模块级
是类属性的理解。然后我把queryset放在\uuuu init\uuu
是平均对象级别下。我说得对吗?非常感谢。非常感谢。我从来不知道这种技巧。你怎么知道这个解决方案?我将来可以用什么主题来防止这个bug呢?在\uuuu init\uuuu
方法中设置查询集是一种非常常见的技术,我不确定是从哪里学来的。通过确保不在模块级别执行任何数据库查询,可以避免类似的错误。这意味着将查询集移动到视图/表单方法中。我对表单非常陌生