django rest框架多数据库
我有一个视图,用于GET和POST到一个不是默认数据库的数据库django rest框架多数据库,django,django-rest-framework,Django,Django Rest Framework,我有一个视图,用于GET和POST到一个不是默认数据库的数据库 class DeployResourceFilterView(generics.ListAPIView): serializer_class = ResourceSerializer def get(self, request, format=None): resname = self.request.GET.get('name') queryset = Resmst.objects
class DeployResourceFilterView(generics.ListAPIView):
serializer_class = ResourceSerializer
def get(self, request, format=None):
resname = self.request.GET.get('name')
queryset = Resmst.objects.db_manager('Admiral').filter(resmst_name=resname)
serializer = ResourceSerializer(queryset)
if queryset:
return Response(serializer.data)
else:
raise Http404
def post(self, request, format=None):
serializer = ResourceSerializer(data=request.DATA, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
GET工作得非常好,但在帖子上它总是抱怨表格不存在而失败。我的假设是,这是因为它试图使用默认数据库,而不是我定义为辅助数据库的“上将”数据库。如何将帖子分配为使用特定数据库而不是默认数据库?请参见文档链接: 您可以指定要保存到的数据库,只需将其作为参数传递:
my_object.save(using='database-name')
在您的情况下,它将是:
serializer.save(using='Admiral')
您还应该在查询集中使用它,如下所示:
queryset = Resmst.objects.using('Admiral').filter(resmst_name=resname)
由于它是一个查询集,而不是像创建对象那样需要db\u管理器的命令。在op提供的代码中,当序列化程序试图保存时,即在线保存时,会出现问题
serializer.save()
-正在使用默认数据库。不能像接受的答案所建议的那样使用serializer.save(使用class='database_name')表单,因为序列化程序类(在本例中是ResourceSerializer类)不会理解/期望kwarg“使用class='database_name”)
django文档声明,如果您有一个模型(model.model),那么可以使用
my_object.save(使用class='database_name')有关报价,请参见此处:
. 但序列化程序显然不是一个模型实例
在上述这种情况下,您可以将ResourceSerializer子类化(或修改-我更喜欢在自己创建序列化程序时修改),并更改创建和更新方法,以利用db_manager(“Admiral”)工作。例如:
class MyResourceSerializer(ResourceSerializer):
def create(self, validated_data):
"""
copy the create from ResourceSerializer and amend it here, with code such as
follows in the try section.
"""
ModelClass=Resmst # or whichever desired model you are acting on
try:
instance = ModelClass.objects.db_manager('Admiral').create(**validated_data)
except TypeError: # or whatever error type you are mitigating against, if any
raise TypeError()
return instance
一个很好的替代方法(正如elim在对这个问题的一个评论中提到的)是添加一个路由器,并在整个代码中不必插入“使用”或“db_管理器”:例如,假设您正在使用一个ListCreateAPIView
您可能可以在视图级别使用get\u queryset
其中在设置.py
中定义了您的读取副本:
replica_database_url = os.environ.get("DATABASE_REPLICA_URL") or database_url
DATABASES["your_read_replica"] = dj_database_url.parse(replica_database_url)
谢谢,但它似乎仍然强制默认数据库不知道为什么。我解决了Django数据库路由器的问题。
replica_database_url = os.environ.get("DATABASE_REPLICA_URL") or database_url
DATABASES["your_read_replica"] = dj_database_url.parse(replica_database_url)