Django的loaddata返回关系权限被拒绝

3
我正在尝试使用loaddata从一个django项目的dumpdata生成的json文件中加载一些数据到一个具有新数据库的新项目中。与数据库的连接似乎正常,但几乎立即收到了关于django_content_type权限被拒绝的错误。我不知道我们在谈论什么权限。数据库是postgres,并在一个独立的服务器上。我通过我的笔记本电脑上的vagrant虚拟机连接到它,该虚拟机具有虚拟环境,并且settings.py具有用于连接到数据库的设置。 以下是Traceback:
Problem installing fixture 'djgprd1_dumpdata.json': Traceback (most recent call last):
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 196, in handle
    obj.save(using=using)
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/models/base.py", line 524, in save_base
    manager.using(using).filter(pk=pk_val).exists())):
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/models/query.py", line 565, in exists
    return self.query.has_results(using=self.db)
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 441, in has_results
    return bool(compiler.execute_sql(SINGLE))
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
    cursor.execute(sql, params)
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/home/vagrant/devenv/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
DatabaseError: Could not load contenttypes.ContentType(pk=29): permission denied for relation django_content_type

我在这里做错了什么?
2个回答

4
这个数据库的postgres用户是自动创建的,我没有检查其权限。对于这个数据库来说,它的权限丢失了,所以执行GRANT ALL PRIVILEGES ON DATABASE x for user y;命令解决了权限问题。是我的失误。

2
看起来你正在导出ContentType对象(你使用了--all选项进行了dumpdata吗?),这是按设计要求的吗?
文档提到你可能想要使用--natural标志,它可以修复此类问题,请参见https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-option---natural 还请参阅以下引用:

如果您正在从实现通用关系的模型序列化数据(例如生成fixture),则应该使用自然键来唯一标识相关的ContentType对象。有关更多信息,请参见自然键和dumpdata --natural。

来源:https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/

我没有使用任何标志进行dumpdata,这不是出于设计考虑,现在我正在尝试使用--natural。 - Bastian
您还可以使用 --exclude 来显式地从转储中排除内容类型对象。 - Yuval Adam
阅读文档后,我仍然不确定是否理解,我不会在新的数据库中错过contenttype对象吗?我可以安全地移动它们而不需要这些对象吗? - Bastian
我之所以收到这个错误是因为该用户没有相应的权限。我的错,它是自动创建的,我认为一切都是正确的。在检查后,我意识到权限不够。 - Bastian
是的,如果没有 contenttype,一些东西将无法正常工作(请参阅 contenttype 文档页面)。但是,--natural 应该可以解决这个问题。 - Yuval Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接