我在运行测试时发现错误,即$ ./manage.py test --settings=my.test.settings
django.db.utils.ProgrammingError: relation "<relation name>" does not exist
这是在运行./manage.py makemigrations && migrate
。
答案 0 :(得分:2)
最终,由于未能为新应用程序创建初始迁移,导致(通常)此错误。运行$ ./manage.py makemigrations <my new app module name> && migrate
注:makemigrations
不会自动为新应用创建初始移植
答案 1 :(得分:1)
发生此错误是因为我试图运行一段在Django启动时访问数据库的代码。
# file name: blog/apps.py
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
def ready(self):
from .business import markdown_to_html
markdown_to_html.refresh_posts() # This method access the database.
然后,当我执行测试:python manage.py test
时,此代码段已执行,并且出现了您提到的错误。
为什么?此处说明:https://docs.djangoproject.com/en/3.0/ref/applications/#django.apps.AppConfig.ready
由于只需要执行一次此方法,所以我决定创建一个管理命令。
代码如下:
# file name: md_to_html.py
from django.core.management.base import BaseCommand
from blog.business import markdown_to_html
class Command(BaseCommand):
help = 'Convert posts written in markdown to html'
def handle(self, *args, **options):
markdown_to_html.refresh_posts()
self.stdout.write(self.style.SUCCESS('HTML files created'))
在开始Django项目之前,我使用以下行执行命令:python manage.py md_to_html
。通过这种方式,我确保此代码只能安全地执行一次。
现在,当我运行测试时,我不再收到错误。
在这里您可以找到有关如何在Django中创建自定义管理命令的更多信息:https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/
此链接描述了如何测试自定义管理命令:https://docs.djangoproject.com/en/3.0/topics/testing/tools/#topics-testing-management-commands