Django: ContentType.objects.get() 报错 "django.db.utils.ProgrammingError: relation "django_content_type" 不存在

2 投票
1 回答
3140 浏览
提问于 2025-04-18 15:48

在我的Django应用中,models.py文件里有两行代码使用了ContentType.objects.get()

class Comment (Content):
    text = models.CharField(max_length=500)
    proposal = models.ForeignKey("Proposal", null=False, related_name="comments")
    contentType = ContentType.objects.get(app_label="myapp", model="comment")

class Proposal (Content):
    title = models.CharField(max_length=100)
    text = models.TextField()
    contentType = ContentType.objects.get(app_label="myapp", model="proposal")

当我运行python manage.py syncdb或者python manage.py shell时,它们会报错(django.db.utils.ProgrammingError: relation "django_content_type" does not exist)。我尝试过删除并重新创建数据库,但还是没用。如果我把这两行代码注释掉,syncdb就能正常工作(但这样显然会导致应用出问题)。

我在INSTALLED_APPS里已经添加了django.contrib.contenttypes

以下是完整的错误追踪信息:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/base.py", line 284, in execute
    self.validate()
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/base.py", line 310, in validate
    num_errors = get_validation_errors(s, app)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/core/management/validation.py", line 34, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/loading.py", line 196, in get_app_errors
    self._populate()
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/loading.py", line 75, in _populate
    self.load_app(app_name, True)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/loading.py", line 99, in load_app
    models = import_module('%s.models' % app_name)
  File "/path/to/virtualenv/lib/python3.4/importlib/__init__.py", line 104, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2231, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1129, in _exec
  File "<frozen importlib._bootstrap>", line 1448, in exec_module
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "/path/to/django/app/models.py", line 42, in <module>
    class Comment (Content):
  File "/path/to/django/app/models.py", line 46, in Comment
    contentType = ContentType.objects.get(app_label="myapp", model="comment")
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/query.py", line 301, in get
    num = len(clone)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/query.py", line 77, in __len__
    self._fetch_all()
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/query.py", line 854, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/query.py", line 220, in iterator
    for row in compiler.results_iter():
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 709, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 782, in execute_sql
    cursor.execute(sql, params)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/backends/util.py", line 69, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/utils/six.py", line 535, in reraise
    raise value.with_traceback(tb)
  File "/path/to/virtualenv/lib/python3.4/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "django_content_type" does not exist
LINE 1: ..."."app_label", "django_content_type"."model" FROM "django_co...

1 个回答

2

我不太确定你想做什么,但你不能在定义另一个模型的时候这样使用模型对象。你是在让Django在做任何事情之前先获取一个特定的ContentType实例——甚至在它有机会为ContentType创建表之前。你需要用一个外键来指向ContentType。

class Comment (Content):
    text = models.CharField(max_length=500)
    proposal = models.ForeignKey("Proposal", null=False, related_name="comments")
    contentType = models.ForeignKey(ContentType)

不过,如果你实际上是想要一个通用关系,你还需要添加一个字段,用来存储与这个关系指向的类相关的对象ID,另外还需要一个伪字段来方便访问这些信息:

    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('contentType', 'object_id')

可以查看通用关系的文档

撰写回答