【问题标题】:Python Django - Read data from multiple databasesPython Django - 从多个数据库读取数据
【发布时间】:2019-06-09 06:02:53
【问题描述】:

我有一个适用于多个数据库的 Django 应用程序,但在尝试专门从 (testdb2) 数据库读取数据时遇到问题。

我知道您可以使用关键字 (Using) 选择要读取数据的数据库,但这不起作用。结果是它总是试图从 (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

【问题讨论】:

  • 为什么using 不起作用?请提供更多信息。 using 方法什么时候不起作用?
  • @YongjinJo,因为它总是从 testdb(默认)而不是 testdb2 读取。我已经在关键字 (Using) 中使用了 testdb2 (users) 的别名,但结果是一样的。

标签: python sql-server django postgresql


【解决方案1】:

我认为viewset 仅在list 中使用using 方法。因为using方法只在queryset中,所以不要使用viewset,或者使用数据库路由器。

我推荐你使用数据库路由器。检查Database Router Doc

【讨论】:

    【解决方案2】:

    除了 Yongjin Jo 的意见,DRF 中的ModelViewSet 继承了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方法。

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

    【讨论】:

    • +addition, drf doc 关于保存方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2017-12-28
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多