Django 测试 - 固定装置用户匹配查询不存在

标签 django django-testing django-fixtures django-serializer

我正在尝试运行加载夹具的测试。其中一个模型具有 ContentTypeGenericForeign 键和 auth.Users 的外键。它将用户与他们创建的内容相关联。我使用 --natural 键创建了固定装置(如下所示),并且可以将外键解析为名称。

python manage.py dumpdata mtm --natural --indent=4

运行测试时出现以下错误:

DeserializationError: Problem installing fixture 'fix.json': User matching query does not  exist.

manage.py 转储的示例数据库对象:

{
"pk": 7, 
"model": "xx.vendor", 
"fields": {
    "phone_number": "777777777777777", 
    "alternative_phone_number": "", 
    "object_id": 1, 
    "contact_email": "", 
    "user": [
        "john"
    ], 
    "content_type": [
        "xx", 
        "axe"
    ], 
    "contact_person": "jimmy"
}
},

完整回溯:

    Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py", line 178, in __call__
    self._pre_setup()
  File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py", line 749, in _pre_setup
    self._fixture_setup()
  File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py", line 881, in _fixture_setup
    'skip_validation': True,
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 159, in call_command
    return klass.execute(*args, **defaults)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/loaddata.py", line 55, in handle
    self.loaddata(fixture_labels)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/loaddata.py", line 84, in loaddata
    self.load_label(fixture_label)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/loaddata.py", line 134, in load_label
    for obj in objects:
  File "/usr/local/lib/python2.7/dist-packages/django/core/serializers/json.py", line 76, in Deserializer
    six.reraise(DeserializationError, DeserializationError(e), sys.exc_info()[2])
  File "/usr/local/lib/python2.7/dist-packages/django/core/serializers/json.py", line 70, in Deserializer
    for obj in PythonDeserializer(objects, **options):
  File "/usr/local/lib/python2.7/dist-packages/django/core/serializers/python.py", line 124, in Deserializer
    obj = field.rel.to._default_manager.db_manager(db).get_by_natural_key(*field_value)
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py", line 167, in get_by_natural_key
    return self.get(**{self.model.USERNAME_FIELD: username})
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 307, in get
    self.model._meta.object_name)

编辑:

我已确认供应商模型引用的所有用户都存在于数据库中。

更新1:

我的prpject使用ContentType的GenericForeign键和auth.Users的外键。我使用 --natural 选项转储数据,但这导致了上述问题。现在我删除了 --natural 选项,转储了所有 3 个应用程序 myApp、auth、contenttypes 的数据。当我运行测试时,我得到“无法加载 contenttypes.ContentType(pk=50):列 app_label、模型不唯一”。我认为这是由于导入模型时动态创建的内容类型。有什么办法解决这个问题吗?

最佳答案

它们可能存在于“数据库”中。但它们存在于您的测试数据库中吗?当您运行测试时,Django 会创建一个 test database 。因此,您必须从数据库中转储用户并将它们也作为固定装置加载。

维护固定装置是一场噩梦。我建议您使用类似 model mommy 的内容或factory boy在测试时创建您的装置。就我个人而言,我最喜欢模型 Mommy API,但您的口味可能会有所不同。

关于Django 测试 - 固定装置用户匹配查询不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22537440/

相关文章:

python - django shell 未检测到新模块

python - 如何在 Python 中测试 Nonetype

当我运行测试时 Django LiveServerTestCase 挂起

python - APIView 的 GET api 测试用例在 djangorestframework 中不起作用

django - 一次加载多个灯具

django - 使用固定装置将 django admin auth.groups 和用户迁移到新数据库

Django复合在多个模型字段上是唯一的

python - 有什么方法可以将自定义/调试消息添加到 python/django unittest.TestCase 的失败测试方法的详细信息中?

Django 的syncdb 正在auth_permission 表中插入重复的条目

django - 如何获取正在运行的服务器 URL