如何使用一个db来运行django服务和其他来获取数据

时间:2018-05-24 18:16:59

标签: python django django-models django-views

我有一个现有的应用程序数据库,我的网站只能根据用户输入获取数据。在settings.py文件中添加了数据库详细信息,我尝试了python manage.py integratedb并将所有300多个表格移到我的models.py文件中。我永远无法做python manage.py runserver它犯了一百万个错误。现在我找到了一个解决方案,但我需要你的意见。

我将默认服务器添加到settings.py并使用它我能够运行服务器。 settings.py看起来像这样。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
        },
    'user': {   
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME'  : 'test',
        'USER'  : 'testuser',
        'PASSWORD': 'readonly',
        'HOST'  : '10.20.30.40',
        'PORT'  : '5446',
    }
}

现在我可以访问user db从表单中获取数据了吗?例如

views.py看起来像这样

from django.shortcuts import render_to_response
from .models import TestCases
from django.shortcuts import HttpResponse
from django.http import JsonResponse
from django.forms.models import model_to_dict
from django.views.decorators.csrf import csrf_exempt


# Create your views here.

@csrf_exempt
def index(request):
    posts = TestCases.objects.all()[:10]
    return render_to_response('index.html',{'posts':posts})

其中TestCasesmodels.py文件中的类名。

现在,当我点击按钮检索数据时,我得到“没有这样的表:test_cases”

models.py looks like


class TestCases(models.Model):
    id = models.BigIntegerField(primary_key=True)
    clientid = models.ForeignKey(Clients, db_column='clientid')
    projectid = models.ForeignKey(Projects, db_column='projectid')


    class Meta:
        managed = False
        db_table = 'test_cases'

从用户输入中获取数据我做错了什么。请帮忙。

2 个答案:

答案 0 :(得分:2)

Queryset .using()方法

我想Django会选择默认数据库。

试试这个:

@csrf_exempt
def index(request):
    posts = TestCases.objects.using('user').all()[:10]
    return render_to_response('index.html',{'posts':posts})

using设置为查询集时,可以指定django要查询的数据库。

Django docs

中的更多信息

一种更好的方法,因此您无需手动将其设置为所有查询。

您可以手动将其添加到所有查询中,也可以为对象创建自定义管理器,并强制它将特定数据库用于对象。

例如:

# this will override the default queryset for objects that use this Manager
class UserDatabaseManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().using('user')


class MyModel(models.Models):
    objects = UserDatabaseManager()

然后,当您使用MyModel时,您可以像往常一样进行查询,Django将user db仅用于具有objects = UserDatabaseManager()的模型的默认值。

请记住,这只是一个简单的使用管理器,您可以拥有多个经理并做很多很酷的事情。

查看Django Managers docs

答案 1 :(得分:0)

首先你需要做的是:

python manage.py inspectdb > models.py

将模型存储到models.py

默认情况下,inspectdb会创建非托管模型。也就是说,在模型的Meta类中,managed = False告诉Django不要管理每个表的创建,修改和删除,如果你想让Django管理表的生命周期,你需要将上面的托管选项更改为True (或者只是删除它,因为True是默认值)。

接下来,运行migrate命令以安装任何额外需要的数据库

python manage.py migrate

integrating docs