无法从已部署的Heroku应用程序中的Django数据库中检索

时间:2017-06-25 00:19:01

标签: python django heroku django-mptt

大家好,我真的很困惑用Django / Heroku开发我的网站。 (还使用mptt)

我收到错误:( again2是表的名称)

  DoesNotExist: again2 matching query does not exist.

我在本地运行时没有出错,但是当我部署到Heroku时出现500错误。所以在Heroku和我的Django数据库之间的通信方面出了问题。但我不知道该怎么做才能解决这个问题?

我所做的事情清单(查看其他人的问题):

  • python manage.py makemigrations,然后是git commit,推送到heroku,heroku运行manage.py migrate
  • 我已将''django.contrib.sites'导入我已安装的应用中,我将myokuapp网址保存为网站对象
  • 我有更新的requirements.txt
  • heroku似乎在为应用程序创建的数据库中有“数据”和表格(heroku postgres)

以下是我的观点:

 def topic_detail(request, x):
     text1 = str(again2.objects.get(pk='Top').get_children())
    return render(request, 'things/topic_detail.html', {
        'text1': text1,
   })

在本地这可以工作,在部署时它会给出错误,如果我将text1替换为again2.objects.all()它将在本地显示内容但在部署到heroku时没有任何内容(没有错误)基本上我正在尝试做的是(现在)显示Top的子项,它们是again2的成员。

我无法真正前进,直到我弄明白,你的帮助将不胜感激,如果还有什么需要请告诉我,请提前谢谢

2 个答案:

答案 0 :(得分:2)

这与迁移,需求文件或virtualenvs无关。 DoesNotExist只意味着一件事。该对象在您的数据库中不存在。当您以这种方式使用.get时,您总是将其包裹在try expect中或使用get_object_or_404而不是

def topic_detail(request, x):
    try: 
        text1 = str(again2.objects.get(pk='Top').get_children())
        return render(request, 'things/topic_detail.html', {
           'text1': text1,
       })
    except again2.DoesNotExist
        raise Http404

或更简洁

   text = get_object_or_404(again2, pk='Top')

您可以使用cli

确认您的数据库没有此记录

现在提出一些未经请求的建议。请养成用大写字母开始上课名字的习惯。

更新:迁移

Django migrations是管理架构的一种无痛方式。一种简单的方法来更改模型并将它们反映在数据库中。应用迁移不会导致一台服务器的数据被移动到另一台服务器。为此你需要

./manage.py dumpdata > dumpfile.json
./manage.py loaddata dumpfile.json

或者您可以使用更高效的posgresql COPY FROM / TO。

答案 1 :(得分:0)

这将解决您的问题:

  1. 首先,从终端在项目根目录中运行此命令:

    python3 manage.py dumpdata > dumpfile.json

  2. 然后将其部署到Heroku。 (我想你知道)

  3. 部署后,从终端在项目根目录中运行此命令:

    heroku run bash

这将启动heroku bash,您可以在其中键入ls来查看托管文件。现在您可以在这里看到dumpfile.json

运行python3 manage.py loaddata dumpfile.json,这会将您的所有对象转移到Heroku数据库中。

要在Django管理员中查看相同的内容,您需要再次在Heroku bash中创建超级用户并设置凭据。

python3 manage.py createsuperuser

然后设置用户名,电子邮件和密码。 现在,您可以转到Django管理员,并验证数据库对象已成功传输。

希望它有所帮助!