# Django, la guía que me ha ayudado a manejarlo eficazmente

En mi trabajo me toco manejar el backend con Django y se me hizo bastante duro el comprenderlo, además que no me gustaba mucho python debido a que por un mal espaciado produce errores, prefiero usar corchetes y punto y coma.

Pero el trabajo me solicitaba utilizarlo y así pude descubrir su potencial que habiendo manejado lenguajes backend como JS con NodeJS, PHP con Laravel y ahora Python con Django, mi orden de frameworks más recomendados y optimizados serián:

- NodeJS
- Django
- Laravel

Algunos tips y funciones útiles que puedes o no utilizarlas van a ser listadas y el blog se ira actualizando mediante la profundización en el framework siga avanzando.

### Lanzar Errores Propios en formato JSON
```python
# Importar la librería
from rest_framework.exceptions import APIException
# Utilizar la librería
raise APIException("el mensaje a ser retornado")
```

### Manejo de Migraciones
Cuando se necesite resetear las migraciones debido a algún conflicto que tengamos o porque no se aplican los cambios hechos, debemos tomar en cuenta dos casos:

#### *Si podemos borrar toda la BDD*

Lo primero que debemos hacer es borrar todos los archivos en la carpeta migraciones excepto el archivo **__init__.py** .
```
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete   
```
Luego de eso podemos crear de nuevo las migraciones con el comando:
```cmd
python manage.py makemigrations
```
y ejecutamos las migraciones con el comando: 
```bash
python manage.py migrate
```

#### *Si borrar toda la BDD no es posible*
Primero debemos limpiar las migraciones con el comando:
```
python manage.py migrate --fake nombreAplicacion zero
```
Si queremos comprobar que se limpiaron correctamente ejecutamos el siguiente comando y nos listara de cada aplicación las migraciones respectivas
```
python manage.py showmigrations
```
Luego de eso procedemos a borrar todos los archivos en la carpeta migraciones excepto el archivo **__init__.py** .
```
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete   
```
Luego de eso podemos crear de nuevo las migraciones con el comando:
```
python manage.py makemigrations
```
y ejecutamos las migraciones agregando la bandera **--fake-initial** para que django marque las migraciones como ejecutadas cuando realmente no lo hace, para evitar el problema de que algunas tablas ya existen: 
```
python manage.py migrate --fake-initial
```

## Exportar/Importar datos con Django

Para crear un fixture con los datos actuales el comando es:
```
python manage.py dumpdata api > api/fixtures/all_2020_02_25_final.json
```

Para cargar datos desde el fixture creado
```
python manage.py loaddata api/fixtures/all_2020_02_25_final.json
```

Hecho esto podemos trabajar normalmente con este gran Framework de Python

### Autor
> Stalin Maza
