python - instalar - pip3 install rest_framework
Django Rest Framework: establece la base de datos dinámicamente desde el parámetro URL (2)
Creo que el mejor lugar para tal funcionalidad es un QuerySet
o un ModelManager . Por ejemplo, el serializador predeterminado del DRF usa el administrador del modelo predeterminado para crear objetos. Desafortunadamente, QuerySet
no tiene una manera de cambiar fácilmente la base de datos actual ( self.db
) dependiendo de los campos de los modelos, por lo que deberá anular todos los métodos relevantes.
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()
Estoy tratando de encontrar la manera correcta de hacer esto:
Servicio de usuarios:
/api/<country>/users
/api/us/users
Ese servicio debe usar la base de datos correspondiente al país en la URL.
settings.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'',
} }
Para configurar la base de datos en el ModelViewSet I a esto:
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def get_queryset(self):
country = self.kwargs[''country'']
return User.objects.using(country).all()
El problema aparece cuando trato de hacer un POST o PUT. ¿Debo sobrescribir el método create () o save () del serializador? Hay alguna otra manera de hacer esto?
¡Muchas gracias!
Gracias Alex! Tu respuesta, ayúdame mucho. Para resolver completamente el problema, tengo que hacer esto:
views.py
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def perform_create(self, serializer):
serializer.validated_data[''country''] = self.kwargs.get(''country'')
serializer.create(serializer.validated_data)
Y luego en el models.py:
class UserQuerySet(models.QuerySet):
def create(self, **kwargs):
country = kwargs.get(''country'') #Get the country
kwargs.pop(''country'') #Pop the country from kwargs
obj = self.model(**kwargs)
self._for_write = True
obj.save(force_insert=True, using=country)
return obj
class User(models.Model):
objects = UserQuerySet.as_manager()
id = models.AutoField(primary_key=True,db_column=''user_id'')
name = models.CharField(max_length=40)
class Meta:
managed = True
db_table = Constants().USER
¡Y el problema está resuelto! Muchas gracias.