模拟Django ModelChoiceField的数据库

2024-03-28 16:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在不影响数据库的情况下测试窗体。表单使用ModelChoiceField引用模型,ModelChoiceField在form.is_valid()期间运行查询,该查询尝试从数据库中获取引用的对象。这发生在related_object_field.to_python()中,它试图从默认管理器的QuerySet中获取对象。你知道吗

我试着修补我模型的queryset.get(),但没有效果:

@patch('myapp.models.MyModel._default_manager.get_queryset')
def test_form(mocked_get_queryset):
    assert mocked_get_queryset.called  # <-- this assertion fails
    [...]
    form = MyForm(data=my_data)
    assert form.is_valid()

这是回溯的一个片段,它显示了为什么数据库被击中,以及我想嘲弄的内容:

    form.is_valid()
django/forms/forms.py:179: in is_valid
    return self.is_bound and not self.errors
django/forms/forms.py:174: in errors
    self.full_clean()
django/forms/forms.py:376: in full_clean
    self._clean_fields()
django/forms/forms.py:394: in _clean_fields
    value = field.clean(value)
django/forms/fields.py:148: in clean
    value = self.to_python(value)
django/forms/models.py:1245: in to_python
    value = self.queryset.get(**{key: value})
[...]
E       Failed: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.

我想我没有找到合适的地方。你能给我一些关于如何模拟数据库调用的提示吗?你知道吗


Tags: todjangoinpyselfformclean数据库