在DRF中更新为非标准数据库

时间:2019-11-02 17:37:44

标签: django django-rest-framework

使用 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], })

0 个答案:

没有答案