python - Django 休息框架 : set database dynamically from URL parameter

标签 python django database django-rest-framework

我正在尝试找到执行此操作的正确方法:

用户服务:

/api/<country>/users
/api/us/users

该服务应使用与 URL 中的国家对应的数据库。

设置.py:

DATABASES = {
'default': {},
'us': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'XXX_US', 
    'USER': 'US',
    'PASSWORD': 'XXX',
    'HOST': 'localhost',
    'PORT': '5432',
},
'es': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'XXX_ES', 
    'USER': 'ES',
    'PASSWORD': 'XXX',
    'HOST': 'localhost',
    'PORT': '5432',
}  }

要将 ModelViewSet I 中的数据库设置为:

class UserViewSet(viewsets.ModelViewSet):

    model = User
    serializer_class = UserSerializer

    def get_queryset(self):
        country = self.kwargs['country']
        return User.objects.using(country).all()

当我尝试执行 POST 或 PUT 时出现问题。我是否必须覆盖序列化程序的 create() 或 save() 方法?还有其他方法吗?

非常感谢!

最佳答案

我认为此类功能的最佳位置是 QuerySetModelManager .例如,DRF 的默认序列化器使用 the default model's manager用于创建对象。不幸的是,QuerySet 无法根据模型的字段轻松更改当前数据库 (self.db),因此您必须覆盖所有相关方法。

class UserQuerySet(models.QuerySet):
    def create(self, **kwargs):
        obj = self.model(**kwargs)
        self._for_write = True
        obj.save(force_insert=True, using=kwargs.get('country'))
        return obj

class User(models.Model):
    objects = UserQuerySet.as_manager()

关于python - Django 休息框架 : set database dynamically from URL parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34682216/

相关文章:

python - Django TemplateSyntaxError : current transaction is aborted, 这个异常是什么意思? postgresql 8.4 可以在 django 上正常工作吗?

Python fabric "local"函数不遵守环境变量 DJANGO_SETTINGS_MODULE

sql - 在 SQL 中使用子查询

python - 将轴/绘图区域保存/导出到文件,而不是图形

python - 如何将 pyspark 数据帧分成两行

python - 从字典中排除重复值并相应地增加 'qty' 字段

Python 请求本地地址抛出 SSLError

mysql - 查看/分析 Django 中的所有数据库访问

java - 将时间戳从数据库转换为 java.sql.Timestamp

database - 寻找D2009+的本地数据库