簡體   English   中英

Django 遷移數據庫 django.db.utils.ProgrammingError:關系“django_site”不存在

[英]Django Migrating DB django.db.utils.ProgrammingError: relation "django_site" does not exist

為 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

ProgrammingError 是一個數據庫錯誤。 這意味着您正在嘗試讀取的表尚未准備好,因為您嘗試在創建之前訪問它:

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

您應該使用 post_migrate 信號在獨立函數中加載靜態 current_site 變量。 文檔中有一個例子

如果您發現這種矯枉過正,可以使用以下解決方法

  1. 抓住錯誤。 這將允許您進行遷移,並且在應用程序下次重新啟動時,它將完美地讀取對象。
    from django.db import ProgrammingError
    class LatestBlogEntries(Feed):
        try:
            current_site = Site.objects.get_current()
        except ProgrammingError:
            pass
  1. 如果未定義,則在 _ init_方法中加載變量。

這通常發生在此操作使用已創建的表建模時,然后清除數據庫以從頭開始。

您不應在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM