Как использовать одну базу данных для запуска службы django, а другую - для получения данных - PullRequest
0 голосов
/ 24 мая 2018

У меня есть база данных приложения, из которой мой веб-сайт должен получать данные только в соответствии с пользовательским вводом.Добавил сведения о базе данных в файл 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})

, где TestCases - имя класса из файла models.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 голосов
/ 24 мая 2018

Прежде всего вам нужно сделать:

python manage.py inspectdb > models.py

, чтобы сохранить ваши модели в models.py

По умолчанию inspectdb создает неуправляемые модели.Таким образом, managed = False в мета-классе модели говорит Django не управлять созданием, изменением и удалением каждой таблицы. Если вы хотите, чтобы Django управлял жизненным циклом таблицы, вам нужно изменить вышеуказанный параметр управления на True(или просто удалите его, поскольку True является его значением по умолчанию).

Затем выполните команду migrate, чтобы установить любую дополнительную необходимую базу данных

python manage.py migrate

, интегрируя документы

0 голосов
/ 24 мая 2018

Queryset .using() метод

Я полагаю, Django использует базу данных по умолчанию.

Попробуйте:

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

Когда вы установите using наqueryset, вы можете указать, к какой базе данных 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 дБ по умолчанию только для моделей, которые имеют objects = UserDatabaseManager().

Keep.помните, что это простое использование менеджера, вы можете иметь несколько менеджеров и делать много интересных вещей.

Взгляните на документы Django Managers

...