0

I have a Django app that works with multiple databases and I'm having an issue trying to read data specifically from (testdb2) database.

I do know that you can choose which database that you want to read data using keyword (Using) but that didn't work. The result is it's always tries to read data from (testdb).

Here is the code for database in (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',
    },
},

}

Here is the code for (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

Here is the code for (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 is based on a view that is created inside the database.

My question: How can I read data from the database (testdb2)

Thanks :D

Mack
  • 343
  • 2
  • 5
  • 12
  • Why does `using` not work? Please give more information. When does `using` method not work? – Jrog Jan 15 '19 at 09:26
  • @YongjinJo, because it always read from testdb (default) instead of the testdb2. I have already used the alias for testdb2 (users) inside the keyword (Using) but the result is the same. – Mack Jan 15 '19 at 09:42

2 Answers2

0

I think viewset uses using method only in list. Because using method is only in queryset, so don't use viewset, or use a database router.

I recommend you database router. Check Database Router Doc

Jrog
  • 1,469
  • 10
  • 29
0

In addition to Yongjin Jo's opinion, ModelViewSet in DRF inherits CreateModelMixin. And it's create function.

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 {}

function create model instance by Serializer. So using method is not used.

You can override save method in Serializer. Or Use database router as Yongjin Jo said.

  • 1
    +addition, [drf doc](https://www.django-rest-framework.org/api-guide/serializers/#saving-instances) about save method –  Jan 24 '19 at 02:45