with rest_framework pip3 instalar framework español python django database django-rest-framework

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.