django rest框架多个数据库

时间:2014-09-05 17:07:59

标签: 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.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工作得非常好,但是在POST上它经常会失败,抱怨表不存在。我的假设是,这是因为它试图使用默认数据库而不是我定义为我的辅助数据库的'Admiral'。如何指定POST使用特定数据库而不是默认数据库?

3 个答案:

答案 0 :(得分:3)

请参阅文档链接:https://docs.djangoproject.com/en/1.7/topics/db/multi-db/#selecting-a-database-for-save

您可以指定要保存的数据库,只需将其作为参数传递:

my_object.save(using='database-name')

在你的情况下,它将是:

serializer.save(using='Admiral')

你也应该在你的queryset中使用它:

queryset = Resmst.objects.using('Admiral').filter(resmst_name=resname)

因为它是一个查询集,而不是一个需要db_manager作为创建对象的命令。

答案 1 :(得分:0)

在op提供的代码中,当尝试保存序列化程序时(即在线上),就会出现问题

serializer.save()

-正在使用默认数据库。不能使用格式serializer.save(using ='database_name')的形式,因为串行化程序类(在本例中为ResourceSerializer类)不会理解/期望kwarg“ using ='database_name”。

django文档指出,如果您有模型(model.Model),则可以保存使用 my_object.save(using ='database_name')参见报价:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/#selecting-a-database-for-save 。但是序列化器显然不是模型实例。

在上述情况下,您可以使用Resource_Serializer子类化(或修改-我更喜欢在自己创建序列化程序时进行修改),并更改创建和更新方法以使用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在此问题的评论之一中提到的)是添加一个路由器并完成所有处理,而不必在整个代码中插入“ using”或“ db_manager”:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/#using-routers < / p>

答案 2 :(得分:0)

例如,您正在使用 $oCustom = Create-Custom-Object sleep 5 $oWrapper = Create-Wrapper-Object $oCustom echo "Custom-Test: $($oCustom.Test)" Custom-Test: 05/31/2021 08:52:30 echo "Wrapper-Test: $($oWrapper.Test)" Wrapper-Test: 05/31/2021 08:52:35 echo "GetTest: $($oCustom.GetTest())" GetTest: 05/31/2021 08:52:30 echo "WrapTest: $($oWrapper.WrapTest())" WrapTest: 05/31/2021 08:52:30

您或许可以在视图级别使用 ListCreateAPIView

get_queryset

其中 class YourModelDRFGetView(generics.ListCreateAPIView): serializer_class = YourModelDRFViewSerializer def get_queryset(self): return YourModel.objects.using('your_read_replica').all() your_read_replica 中定义:

settings.py