Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django pytest在创建数据库之前执行代码_Django_Pytest - Fatal编程技术网

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
方法中设置查询集是一种非常常见的技术,我不确定是从哪里学来的。通过确保不在模块级别执行任何数据库查询,可以避免类似的错误。这意味着将查询集移动到视图/表单方法中。我对
表单非常陌生