我正在尝试找到执行此操作的正确方法:
用户服务:
/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() 方法?还有其他方法吗?
非常感谢!
最佳答案
我认为此类功能的最佳位置是 QuerySet
或 ModelManager .例如,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/