Python Django-从多个数据库读取数据

时间:2019-01-15 08:38:06

标签: python sql-server django postgresql

我有一个可与多个数据库一起使用的Django应用,尝试从(testdb2)数据库中读取数据时遇到问题。

我确实知道您可以使用关键字(使用)来选择要读取数据的数据库,但是该数据库不起作用。结果是它总是尝试从(testdb)读取数据。

这是(Settings.py)中数据库的代码:

DATABASES = {
'default': {
    'NAME': 'testdb',
    'ENGINE': 'django.db.backends.postgresql',
    'USER': 'username',
    'PASSWORD': 'password',
    'HOST': 'host',
    'PORT': 'port',
},
'users': {
    'NAME': 'testdb2',
    'ENGINE': 'sql_server.pyodbc',
    'USER': 'username',
    'PASSWORD': 'password',
    'HOST': 'host',
    'PORT': 'port',
    'OPTIONS': {
        'driver': 'ODBC Driver 13 for SQL Server',
    },
},

}

以下是(Views.py)的代码:

from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer

# Create your views here.

class MyModelView(viewsets.ModelViewSet):
    queryset = MyModel.objects.using('users').all()
    serializer_class = MyModelSerializer

这是(Models.py)的代码:

from django.db import models
from django.db import connection


# Create your models here.
class MyModel(models.Model):
        columnName = models.IntegerField(db_column='columnName', primary_key=True)
        columnEmail= models.IntegerField(db_column='columnEmail')
        columnAddress= models.IntegerField(db_column='columnAddress')  
        columnPhone= models.IntegerField(db_column='columnPhone')

        class Meta:
            managed = False  # Created from a view. Don't remove.
            db_table = 'UserTable'

MyModel基于在数据库内部创建的视图。

我的问题:如何从数据库(testdb2)中读取数据

谢谢:D

2 个答案:

答案 0 :(得分:0)

我认为viewset仅在using中使用list方法。由于using方法仅在queryset中,因此请不要使用viewset或数据库路由器。

我建议您使用数据库路由器。选中Database Router Doc

答案 1 :(得分:0)

除了Yongjin Jo的意见外,ModelViewSet中的DRF继承了CreateModelMixin。这是create函数。

class CreateModelMixin(object):
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}

函数通过Serializer创建模型实例。因此,不使用using方法。

您可以在save中覆盖Serializer方法。或使用Yongjin Jo所说的使用数据库路由器。