django rest框架多数据库

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

我有一个视图,用于GET和POST到一个不是默认数据库的数据库

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)