我有一个视图,我正在使用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使用特定数据库而不是默认数据库?
答案 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