【问题标题】:Django Migrating DB django.db.utils.ProgrammingError: relation "django_site" does not existDjango Migrating DB django.db.utils.ProgrammingError: 关系“django_site”不存在
【发布时间】:2021-02-13 14:21:21
【问题描述】:

正在为 Django 进行站点升级,现在当我尝试 python manage.py makemigrations 时将其推送到服务器,我收到此错误

(kpsga) sammy@kpsga:~/webapps/kpsga$ python manage.py makemigrations
Traceback (most recent call last):
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "django_site" does not exist
LINE 1: ..."django_site"."domain", "django_site"."name" FROM "django_si...
                                                            ^


The above exception was the direct cause of the following exception:
...

File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/sammy/webapps/kpsga/kpsga/urls.py", line 27, in <module>
    path('blog', include('blog.urls')),
...
File "/home/sammy/webapps/kpsga/blog/urls.py", line 2, in <module>
    from blog.views import LatestBlogEntries, blog_archive, blog_entry_by_id, blog_entry
File "/home/sammy/webapps/kpsga/blog/views.py", line 10, in <module>
    class LatestBlogEntries(Feed):
File "/home/sammy/webapps/kpsga/blog/views.py", line 11, in LatestBlogEntries
    current_site = Site.objects.get_current()
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/contrib/sites/models.py", line 58, in get_current
    return self._get_site_by_id(site_id)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/contrib/sites/models.py", line 30, in _get_site_by_id
    site = self.get(pk=site_id)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/sammy/webapps/envs/kpsga/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "django_site" does not exist
LINE 1: ..."django_site"."domain", "django_site"."name" FROM "django_si...

虽然我已将这些添加到设置文件中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',


   
    #additional django
    'django.contrib.sites',
]

SITE_ID = 1

最新课程

class LatestBlogEntries(Feed):
    current_site = Site.objects.get_current()
    title = current_site.name + " - Latest News"
    link = "/news/"
    description = "Latest news and updates from " + current_site.domain
    
    def items(self):
        return BlogEntry.objects.all()[:10]
    def item_title(self, item):
        return item.title
    def item_description(self, item):
        return item.description

【问题讨论】:

  • This question is similar。如果您在阅读后仍然卡住,请从回溯中添加 LatestBlogEntries 类到您的问题。
  • @Alasdair ok 添加了它
  • 你能不能先试试python manage.py migrate再试试python manage.py makemigrations
  • @Hisham___Pak 的行为方式与 migrate sites 相同

标签: python django


【解决方案1】:

您不应该在 LatestBlogEntries 类中调用 Site.objects.get_current()。它需要数据库查找,当您尚未运行初始迁移时,这会导致 relation does not exist 错误。

您可以使用titledescription 的方法。这样,Site.objects.get_current() 在访问提要时运行,而不是在 Django 启动时运行。

class LatestBlogEntries(Feed):

    def title(self, obj):
        current_site = Site.objects.get_current()
        return current_site.name + " - Latest News"

    link = "/news/"

    def description(self, obj):
        current_site = Site.objects.get_current()
        return "Latest news and updates from " + current_site.domain
    
    def items(self):
        return BlogEntry.objects.all()[:10]
    def item_title(self, item):
        return item.title
    def item_description(self, item):
        return item.description

【讨论】:

    【解决方案2】:

    ProgrammingError 是数据库错误。这意味着您尝试读取的表尚未准备好,因为您尝试在创建之前访问它:

    class LatestBlogEntries(Feed):
        current_site = Site.objects.get_current()  <---- this line
    

    您应该使用 post_migrate 信号在独立函数中加载静态 current_site 变量。有一个example in the docs

    如果你发现这种过度杀伤力,有 workarrounds 像:

    1. 捕获错误。这将允许您进行迁移,并且在应用程序的下一次重新启动时,它将完美地读取对象。
        from django.db import ProgrammingError
        class LatestBlogEntries(Feed):
            try:
                current_site = Site.objects.get_current()
            except ProgrammingError:
                pass
    
    1. 如果未定义,则在 _init_ 方法中加载变量。

    这通常发生在此操作使用已创建的表建模,然后清除数据库以从头开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2017-11-18
      • 2018-09-04
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多