5 2_Apps&BD
jp.av.dev edited this page 2021-07-02 22:10:23 -04:00
This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ir a: Repositorio, Templates, Admin Panel


Proyecto y Aplicacion(es)

Modularización

ej. Proyecto1

 __________________________________  
|      Proyecto Tienda Online      |  
|                                  |  
|      App1           App2         |  
| [Panel Control]    [Stock]       |  
|                                  |  
|      App3           App4         |  
|    [Ventas]        [Pagos]       |  
|                                  |  
|      App5           App6         |  
|    [Envíos]       [Promos]       |  
|__________________________________|  

ej. Proyecto2

 __________________________________  
|      Proy. Gestión Almacen       |  
|                                  |  
|      App1           App2         |  
| [Proveedores]      [Stock]       |  
|                                  |  
|      App3           App4         |  
|    [Ventas]        [Pagos]       |  
|                                  |  
|      App5           App6         |  
|    [Envíos]       [Promos]       |  
|__________________________________|  

Recordar activar entorno virtual
*source /home/sat/weblocal/.django-env/bin/activate

Creación de proyecto : django-admin startproject TiendaOnline
Cambiar a carpeta de proy.: cd /TiendaOnline
Ajustar TZ en settings.py : TIME_ZONE = 'America/Santiago'
Creación primera app : python3 manage.py startapp gestionPedidos

/TiendaOnline/gestionPedidos/

- migrations/
- admin.py
- apps.py
- __init__.py
- models.py
- tests.py
- views.py

SQLite3 (default)

/gestionPedidos/models.py

from django.db import models

class Clientes(models.Model):
    nombre = models.CharField(max_length=30)
    direccion = models.CharField(max_length=50)
    email = models.EmailField()
    fono = models.CharField(max_length=10)

class Articulos(models.Model):
    nombre = models.CharField(max_length=30)
    seccion = models.CharField(max_length=20)
    precio = models.IntegerField()

class Pedidos (models.Model):
    numero = models.IntegerField()
    fecha = models.DateField()
    entregado = models.BooleanField() 

settings.py

...
INSTALLED_APPS = [
    ...
    'gestionPedidos',
]
...

Chequear código :

python3 manage.py check gestionPedidos

Creación del modelo Base de Datos :

python3 manage.py makemigrations

# Ver instrucciones SQL
python3 manage.py slqmigrate gestionPedidos 0001

Creación de BD:

python3 manage.py migrate

🔸 acceder al 'shell de django': python3 manage.py shell

Insertar Registros

(InteractiveConsole)

>>> from gestionPedidos.models import Articulos
>>> 
>>> art = Articulos(nombre='mesa', seccion='decoracion', precio=96)
>>> art.save()
>>> 
>>> art2 = Articulos(nombre='camisa', seccion='vestuario', precio=25)
>>> art2.save()
>>> 
>>> art3 = Articulos.objects.create(nombre='taladro', seccion='ferreteria', precio=65)
>>> 

Actualizar Registros

>>> art.precio=99
>>> art.save()
>>> 

Borrar Registros

>>> art5 = Articulos.objects.get(id=2)
>>> art5.delete()
(1, {'gestionPedidos.Articulos': 1})
>>> 

Select

>>> ResConsulta = Articulos.objects.all()
>>> ResConsulta
<QuerySet [<Articulos: Articulos object (1)>, <Articulos: Articulos object (3)>]>
>>> 
>>> # Ver instrucción SQL:
>>> ResConsulta.query.__str__()
'SELECT "gestionPedidos_articulos"."id", "gestionPedidos_articulos"."nombre", "gestionPedidos_articulos"."seccion", "gestionPedidos_articulos"."precio" FROM "gestionPedidos_articulos"'
>>> 

PostgreSQL

Install

sudo apt install postgresql postgresql-contrib libpq-dev

Success. You can now start the database server using:

    pg_ctlcluster 11 main start


# Cambiar a user postgres
sudo -i -u postgres

# sql cli
postgres@sat:~$ psql

# salir
postgres=# \q

# Crear usuario *ambiente de desarrollo
postgres@sat:~$ createuser -P --interactive
Enter name of role to add: django
Shall the new role be a superuser? (y/n) y

# Crear BD con nombre de usuario 
(postgres automaticamente se conecta a un DB con el mismo nombre de usuario)
postgres@sat:~$ createdb django

# Crear password

postgres@ratsat:~$ psql
psql (11.9 (Raspbian 11.9-0+deb10u1))
Type "help" for help.

postgres=# \password django

postgres=# \q

postgres@ratsat:~$ psql -U django -W

Problemas con Log-in ?

sudo vim /etc/postgresql/11/main/pg_hba.conf

# CAMBIAR

# Database administrative login by Unix domain socket
local   all             postgres                               peer

por

# Database administrative login by Unix domain socket
local   all             postgres                                md5
# "local" is for Unix domain socket connections only
local   all             all                                     md5

# Reiniciar servicio
sudo service postgresql restart 

# Para borrar usuario
DROP OWNED BY your_user;
DROP USER your_user;

# Modificar
vim  /etc/postgresql/10/main/postgresql.conf
        ...
        listen_addresses = 'localhost,your-server-ip'
        ...

sudo vim /etc/postgresql/11/main/postgresql.conf
# IPv4 local connections:
host	all		all		192.168.0.0/24		md5

# Regla Firewall
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 5432

Usar algun DBbrowser y crear bd ArticulosClientes

Instalar Python-Django PostgreSQL connector

pip3 install psycopg2

vim settings.py

# Modificar
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

ej.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'articulosclientes',
        'USER': 'nombre_usuario',
        'PASSWORD': 'clave_usuario',
        'HOST': '127.0.0.1',
        'DATABASE_PORT': '5432',
    }
}

# Check
python3 manage.py check

# Hacer migraciones
python3 manage.py makemigrations

# Migrar
python3 manage.py migrate

Crear un registro

python3 manage.py shell

(InteractiveConsole)
>>> from gestionPedidos.models import Clientes
>>> 
>>> cli = Clientes(nombre='Pedro', direccion='dnd vive', email='pe@mail.ru', fono=123456789)
>>> cli.save()
>>> 

Valores en tabla articulos

id nombre seccion precio
1 mesa deco 90
2 lámpara deco 50
3 pantalón vestuario 45
4 destornillador ferreteria 5
5 balón deporte 25
6 raqueta deporte 105
7 muñeca juguetes 15
8 tren eléctrico juguetes 50

Intruccion SQL desde Django

# Select * ... where seccion='deporte';
>>> from gestionPedidos.models import Articulos
>>> 
>>> Articulos.objects.filter(seccion='deporte')
<QuerySet [<Articulos: Articulos object (5)>, <Articulos: Articulos object (6)>]>
>>> 

/TiendaOnline/gestionPedidos/models.py

class Articulos(models.Model):
    nombre = models.CharField(max_length=30)
    seccion = models.CharField(max_length=20)
    precio = models.IntegerField()
    
    def __str__(self):
        return 'Nombre: %s, Depto. %s, Precio $ %s' % (self.nombre, self.seccion, self.precio)
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py shell
>>> from gestionPedidos.models import Articulos
>>> 
>>> Articulos.objects.filter(seccion='deporte')
>>> <QuerySet [<Articulos: Nombre: balón, Depto. deporte, Precio $ 25>,
               <Articulos: Nombre: raqueta, Depto. deporte, Precio $ 105>]>
>>> 


# Select * ... where nombre='mesa' seccion='deco';
>>> Articulos.objects.filter(nombre='mesa', seccion='deco')
<QuerySet [<Articulo: Nombre: mesa, Depto. deco, Precio $ 90>]>
>>> 

# Para buscar por ej. un elemento con precio mayor a 100 desde la shell django
>>> Articulos.objects.filter(precio__gte=100)
<QuerySet [<Articulos: Articulo: raqueta, Depto. deporte, Precio $ 105>]>

otros: __tle, __range, ...).order_by(precio o -precio para inverso) 

>>> Articulos.objects.filter(precio__range=(40,90))
>>> 
<QuerySet [<Articulos: Nombre: mesa, Depto. deco, Precio $ 90>, <Articulos: Nombre: lámpara, Depto. deco, Precio $ 50>, <Articulos: Nombre: pantalón, Depto. vestuario, Precio $ 45>, <Articulos: Nombre: tren eléctrico, Depto. juguetes, Precio $ 50>]>
>>>

>>> Articulos.objects.filter(precio__gte=50).order_by('precio')
<QuerySet [<Articulos: Articulo: lámpara, Depto. deco, Precio $ 50>, <Articulos: Articulo: tren eléctrico, Depto. juguetes, Precio $ 50>, <Articulos: Articulo: mesa, Depto. deco, Precio $ 90>, <Articulos: Articulo: raqueta, Depto. deporte, Precio $ 105>]>


Ir a: Repositorio, Templates, Admin Panel