Как использовать 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 для меня. Я перебираю модели, чтобы автоматически генерировать все сериализаторы и 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 и ModelViewSets из моделей:
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], })