【问题标题】:DeserializationError: [...] Permission matching query does not existDeserializationError: [...] 权限匹配查询不存在
【发布时间】:2016-03-24 21:48:39
【问题描述】:

运行一些单元测试时,我收到DeserializationError 错误。同一文件中的其他测试类正确使用相同的夹具。我很困惑,想知道我做错了什么。

代码如下:

class CreateViewTest(TransactionTestCase):

    fixtures = ['data.yaml']

    def test_create_post_passed(self):
        current = len(Timesheet.objects.all())
        data = {'start': datetime.date.today(), }
        response = self.client.post('/timetracker/create/', data)
        self.assertEqual(response.status_code, 200, response)
        self.assertEqual(current + 1, len(Timesheet.objects.all()))

这是运行单元测试的输出:

======================================================================
ERROR: test_create_post_passed (timetracker.tests.CreateViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/test/testcases.py", line 182, in __call__
    self._pre_setup()
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/test/testcases.py", line 787, in _pre_setup
    self._fixture_setup()
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/test/testcases.py", line 840, in _fixture_setup
    **{'verbosity': 0, 'database': db_name})
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/management/__init__.py", line 120, in call_command
    return command.execute(*args, **defaults)
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 60, in handle
    self.loaddata(fixture_labels)
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 90, in loaddata
    self.load_label(fixture_label)
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 141, in load_label
    for obj in objects:
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/serializers/pyyaml.py", line 79, in Deserializer
    six.reraise(DeserializationError, DeserializationError(e), sys.exc_info()[2])
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer
    for obj in PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options):
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/serializers/python.py", line 132, in Deserializer
    m2m_data[field.name] = [m2m_convert(pk) for pk in field_value]
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/core/serializers/python.py", line 127, in m2m_convert
    return field.rel.to._default_manager.db_manager(db).get_by_natural_key(*value).pk
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/contrib/auth/models.py", line 36, in get_by_natural_key
    content_type=ContentType.objects.db_manager(self.db).get_by_natural_key(app_label, model),
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/usr/Envs/intranet/lib/python2.7/site-packages/django/db/models/query.py", line 334, in get
    self.model._meta.object_name
DeserializationError: Problem installing fixture '/home/usr/repos/intranet/intranet_site/timetracker/fixtures/users.yaml': Permission matching query does not exist.

【问题讨论】:

  • 你还记得你是否设法解决了这个问题吗?如果有,怎么做?
  • @guival 没有修复。我重构了代码。花了很长时间......

标签: django django-fixtures


【解决方案1】:

转储授权权限表后我遇到了同样的问题。删除一些权限后问题就消失了。以下是已删除的权限列表:

- fields:
    codename: add_site
    content_type: [sites, site]
    name: Can add site
  model: auth.permission
- fields:
    codename: change_site
    content_type: [sites, site]
    name: Can change site
  model: auth.permission
- fields:
    codename: delete_site
    content_type: [sites, site]
    name: Can delete site
  model: auth.permission
- fields:
    codename: add_migrationhistory
    content_type: [south, migrationhistory]
    name: Can add migration history
  model: auth.permission
- fields:
    codename: change_migrationhistory
    content_type: [south, migrationhistory]
    name: Can change migration history
  model: auth.permission
- fields:
    codename: delete_migrationhistory
    content_type: [south, migrationhistory]
    name: Can delete migration history
  model: auth.permission

原来我的项目中没有安装sitessouth 应用程序,因此所有这些权限都与不存在的应用程序相关。这些应用程序是较早安装的,并在 Django 升级后被删除。但是存储在数据库中的权限保持不变

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2015-10-10
    • 2012-05-10
    • 2013-03-02
    • 2021-12-10
    • 2021-05-07
    相关资源
    最近更新 更多