Обновление нестандартной базы данных в DRF - PullRequest
0 голосов
/ 02 ноября 2019

Как использовать 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], })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...