我有一个可与多个数据库一起使用的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
答案 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所说的使用数据库路由器。