使用 Django Rest Framework ,如何执行对非标准数据库的更新/ PUT调用?
在我的Django项目中,我正在使用一个单独的数据库来存储应用程序数据:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'bookstore': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'bookstore.sqlite3'),
}
}
我使用 ModelSerializer 和 ModelViewSet 为我自动创建API。我遍历模型以自动生成所有的Serializers和ViewSets(很多表),生成的类最终看起来像这样:
ModelSerializer:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
ModelViewSet:
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.using('bookstore').all()
serializer_class = BookSerializer
我需要在此处添加using('bookstore')
才能完成此工作。
读取(GET)效果很好。当我尝试进行PUT更新时,出现no such table: book
Sqlite错误。
似乎更新没有路由到书店数据库。
为完整起见,我使用以下循环从模型中生成ModelSerializer和ModelViewSet:
ModelSerializer,生成器:
models = dict(apps.all_models['api'])
for name, model in models.items():
class_name = name[:1].upper() + name[1:] + 'Serializer'
Meta = type('Meta', (object, ), {'model': model, 'fields': '__all__'})
print(class_name)
globals()[class_name] = type(class_name, (serializers.ModelSerializer,), {'Meta':Meta, })
ModelViewSet,生成器:
models = dict(apps.all_models['api'])
for name, model in models.items():
capitalized_class_name = name[:1].upper() + name[1:]
viewset_class_name = capitalized_class_name + 'ViewSet'
serializer_class_name = capitalized_class_name + 'Serializer'
globals()[viewset_class_name] = type(viewset_class_name, (viewsets.ModelViewSet,), {'queryset': model.objects.using('bookstore').all(), 'serializer_class': globals()[serializer_class_name],'filter_backends': [filters.OrderingFilter], })