No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

El ORM de Django

12/37
Recursos

Reto de la clase:

Inserta mas usuarios a la base de datos que hemos construido en nuestro entorno de pruebas y realiza consultas en el ORM para traer a los admins.

Crea un nuevo campo PAÍS en el modelo, inserta usuarios y haz filtros.

Aportes 126

Preguntas 32

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

from datetime import date

users = [
    {
        'email': '[email protected]',
        'first_name': 'Christian',
        'last_name': 'Van der Henst',
        'password': '1234567',
        'is_admin': True
    },
    {
        'email': '[email protected]',
        'first_name': 'Freddy',
        'last_name': 'Vega',
        'password': '987654321'
    },
    {
        'email': '[email protected]',
        'first_name': 'Yésica',
        'last_name': 'Cortés',
        'password': 'qwerty',
        'birthdate': date(1990, 12,19)
    },
    {
        'email': '[email protected]',
        'first_name': 'Arturo',
        'last_name': 'Martínez',
        'password': 'msicomputer',
        'is_admin': True,
        'birthdate': date(1981, 11, 6),
        'bio': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
    }
]

from posts.models import User

for user inusers:
    obj = User(**user)
    obj.save()
    print(obj.pk, ':', obj.email)

por si alguien quiere hacer lo contrario y crear modelos a partir de la base de datos solo apliquen el siguiente comando

<python manage.py inspectdb > models.py>

encontré este DJANGO CHEAT SHEET. Se ve que esta muy bueno. si a alguien le sirve. Aquí dejo el link!
https://www.mercurytide.co.uk/media/resources/django-cheat-sheet.pdf

Agregando Atributos

country = models.CharField(max_length=20, null=True)
city = models.CharField(max_length=30, null=True)

Haciendo las migraciones

python manage.py makemigrations
python manage.py migrate

Haciendo los queries

#actualizando datos
>>> from posts.models import User
>>> platzi_users = User.objects.all().update(city='Bogota',country='Colombia')
>>> platzi_users
[email protected].com : Bogota : Colombia
[email protected].com : Bogota : Colombia
[email protected].com : Bogota : Colombia
[email protected].com : Bogota : Colombia
[email protected].com : Bogota : Colombia

Registrando datos

usuario = User.objects.create(
... email='[email protected]',
... password='123456',
... city='Santa Cruz',
... country='Bolivia',
... is_admin=True,
... first_name='Amilkar',
... last_name='Cruz'
... )
>>> usuario.email
'[email protected]'
>>> filter= User.objects.filter(city='Santa Cruz')
>>> filter
<QuerySet [<User: jhon.deo@gmail.com>]>
>>> filter_bogota=User.objects.filter(city__startswith='Bog')
>>> filter_bogota
<QuerySet [<User: hola@gmail.com>, <User: amilkar.cruz13@gmail.com>, <User: cvander@platzi.com>, <User: freddier@platzi.com>, <User: yesica@platzi.com>, <User: arturo@platzi.com>]>

>>> for fb in filter_bogota:
...     print(fb.first_name,':', fb.city,':',fb.country)
...
Amilkar : Bogota : Colombia
Christian : Bogota : Colombia
Freddy : Bogota : Colombia
Yesica : Bogota : Colombia
Arturo : Bogota : Colombia

Solución al reto de la clase

  1. Creación de campos country y city:
country = models.CharField(max_length=3)
city = models.CharField(max_length=200)
  1. Aplicar cambios a la base de datos
py manage.py makemigrations
py manage.py migrate
  1. Consultas varias
platzi_users = User.objects.filter(email__endswith='@platzi.com')
platzi_users.update(country='Platzilandia')
platzi_users.update(city='Cityplatzi')

for user in platzi_users:
	print(user.first_name, '-', user.country, '-', user.city)

Mi tarea:

from django.db import models

class User(models.Model):

    MEXICO = 'MX'
    EUA = 'US'
    COLOMBIA = 'CL'
    VENEZUELA = 'VZ'
    ARGENTINA = 'AR'
    BRAZIL = 'BR'
    COUNTRY_CHOICES = (
        (MEXICO, 'Mexico'),
        (EUA, 'United States'),
        (COLOMBIA, 'Colombia'),
        (VENEZUELA, 'Venezuela'),
        (ARGENTINA, 'Argentina'),
        (BRAZIL, 'Brazil')
    )
    email = models.EmailField(unique = True)
    password = models.CharField(max_length = 100)
    first_name = models.CharField(max_length = 100)
    last_name = models.CharField(max_length = 100)
    is_admin = models.BooleanField(default = False)
    bio = models.TextField(blank = True)
    birthdate = models.DateField(blank = True, null = True)
    country = models.CharField(
        max_length = 2,
        choices = COUNTRY_CHOICES,
        default = MEXICO
    )
    created = models.DateTimeField(auto_now_add = True)
    modified = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.email

Les recomiendo instalar shell_plus, una extensión que les permite tener ipython como intérprete del shell de django. Acá estan las instrucciones

python manage.py shell_plus --ipython

¿que combinacion de teclas usas para limpiar la pantalla?

¿Qué significa ORM?

complemento estas clases de Django con este curso que esta en YouTube (da muy buena la explicacion detallada solamente porque esta en English).
https://www.youtube.com/playlist?list=PLsyeobzWxl7r2ukVgTqIQcl-1T0C2mzau

Es posible también hacerlo con SQL, por ejemplo:

users = User.objects.raw(“select id, first_name, country from posts_user where country = ‘Colombia’”)

Es útil en queries muy complejos, los que cruzan varias tablas, por ejemplo para obtener un reporte. Sólo me queda duda porque en casos así es posible que no sean un objeto User sobre todo si la consulta tiene campos que no son de la tabla User, sino de alguna otra.

Mis apuntes, por fa si hay errores ayúdenme a mejorarlo. 🤗

¿Dónde se pueden descargar los datos que el profesor saca de la nada?

Una recomendacion para que el terminal sea mas funcional y bonito es instalar la dependecia Ipython, es excelente.

Es una consola interactiva que entre otras cosas ofrece autocompletar, identacion automatica, colores en la terminal, etc

Para crear objetos de la base dato masivo desde archivo
1–En carpeta ~/platzigram/posts$
1.1. crear archivo scritp.py
$touch myscript.py
2–Agregar contenido a archivo myscript.py

3–correr script creado con el shell
python3 manage.py shell < posts/myscript.py

Ejecutar archivos.py en la shell de Django

Para ejecutar código de forma práctica en la shell de Django se puede instalar ipython en el entorno virtual, esto permite que cada vez que se ejecute la shell se abra por defecto ipython, y si no se abre automáticamente basta con ejecutar el comando ipython. Una vez dentro de ipython se pueden correr los archivos de script con el comando:

%run ruta/del/script.py

Cabe destacar que en ipython se tienen autocompletados, por ejemplo al escribir ‘import pos’ y luego al presionar tab pararecerá la opción posts. Espero que le sirva a alguien. Saludos.

para ejecutar un archivo dentro el shell de python3:

exec(open("name_file.py").read())

¿porque al momento de agregar el método str al modelo no realizo las migraciones correspondientes?,
¿acaso no son cambios?

pienso que como no ejerce sobre las tablas en si no pasa nada
pero igual genera muchas incógnitas

Otra forma de ingresar datos con el shell usando un json:

Primero debemos crear un archivo json con la info a almacenar:

Luego pegamos el script y ejecutamos en el shell de django:

Se podria entender con el comando

python3 manage.py makemigrations

que los cambios aplicados entran en un estado de staging y que luegos para reflejar estos cambios en la BD con el comando

python3 manage.py migrate 

E posible crear un script como el del curso crud para agragar multiples datos a la base ???

Que puedo usar para que sea obligatorio ingresar cierto dato al crear una instancia?
Por ejemplo el nombre.

Vengo de hacer backend con integración de hardware, y este mundo es muy nuevo para mí 😮

Guardar un usuario en una sola linea:

 ramiro = User(email='ramiro@yahoo.com', first_name='Ramiro', last_name='Rosales', password='samuelito', is_admin=Tru
e).save()

Mi forma favorita 😃

me aparece esto

>>> from posts.models import User
>>>
>>> for user in users:
... obj = User(**user)
  File "<console>", line 2
    obj = User(**user)
    ^
IndentationError: expected an indented block
>>> obj.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'obj' is not defined
>>> obj = User(**user),
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'user' is not defined
>>> obj.save(),
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'obj' is not defined
>>> print(obj.pk, ':', obj.email)```

cuando escribo esto:

```from posts.models import User

for user in users:
	obj = User(**user)
	obj.save()
	print(obj.pk, ':', obj.email)```

Solucion al reto:
1.Crear los campos country y city en models.py

country = models.CharField(max_length=100)
city = models.CharField(max_length=100)
2.Hacemos las migraciones:
python3 manage.py makemigrations
python3 manage.py migrate
3.Introducimos los datos:
from datetime import date

users = [
    {
        'email' : '[email protected]',
        'first_name' : 'Georgina',
        'last_name' : 'Rodriguez',
        'password' : '123456789',
        'birthdate' :  date(1994,1,27),
        'bio' : 'Hello people',
        'country' : 'Argentina',
        'city' : 'Buenos Aires',
    },
    {
        'email' : '[email protected]',
        'first_name' : 'Cristiano',
        'last_name' : 'Aveiro',
        'password' : 'ihavemoney',
        'birthdate' :  date(1984,2,5),
        'bio' : 'i have money and you do not have',
        'country' : 'Portugal',
        'city' : 'Funchal',
    },
    {
        'email' : '[email protected]',
        'first_name' : 'Leonardo',
        'last_name' : 'DiCaprio',
        'password' : 'MYOSCAR!',
        'birthdate' :  date(1974,11,11),
        'bio' : 'Where is my second oscar',
        'country' : 'Estates Unites',
        'city' : 'California',
    }
]

from posts.models import User

for user in users:
    obj = User(**user)
    obj.save()
    print(obj.pk,":",obj.email)
4.Recuperamos los registros con filtros:
gmail_users = User.objects.filter(email__endswith='@gmail.com')
gmail_users
<QuerySet [<User: hola@gmail.com>, <User: pablo@gmail.com>, <User: georgina@gmail.com>, <User: ronaldo@gmail.com>, <User: leonardo@gmail.com>]>

Así quedo mi tabla

Algo que noté interesante, es que makemigrations no te deja crear migraciones, cuando ya existen registros en la base de datos, pero si le pasa el atributo default a los campos que vas a agregar puedes hacerlo:

from django.db import models


class User(models.Model):
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=100)

    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    is_admin = models.BooleanField(default=False)
    bio = models.TextField(blank=True)

    birthday = models.DateField(blank=True, null=True)

    country = models.CharField(max_length=100, default='Mexico')
    city = models.CharField(max_length=100, default='CD Mx')

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.email

objects.get trae la coincidencia por un valor que es unico, en caso de no exirit coincidencia o tener multiples coincidencias genera una exepcion: Filter es más flexible, al correr una búsqueda retorna un queryset con las coincidencias encontradas, este puede ser vació, si encuentra uno a varios se comporta como una lista de objetos del modelo consultado.

mi solución:

from django.db import models


class User(models.Model):
    """User model."""
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    bio = models.TextField(blank=True)
    birthdate = models.DateField(blank=True, null=True)

    country = models.CharField(max_length=50, null=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

y en la consola poner:

from posts.models import User
users = Users.objecst.all()


for user in users:
	print(user.first_name,':',user.country,';',user.email)
country = models.CharField(max_length=50, null=True)
city = models.CharField(max_length=50, null=True)

python3 manage.py makemigrations
python3 manage.py migrate

Agregar nuevos campos desde shell:

users = [
     {
        'email' : 'georgina@gmail.com',
        'password' : '123456789',
        'first_name' : 'Georgina',
        'last_name' : 'Rodriguez',
        'bio' : 'Hello people',
        'country' : 'Argentina',
        'city' : 'Buenos Aires',
        'birthdate' :  date(1994,1,27),
     },
     {
        'email' : 'angel@gmail.com',
        'password' : 'sasdasdas',
        'first_name' : 'Georgina',
        'last_name' : 'ramirez',
        'bio' : 'Whats up nigga',
        'country' : 'Sonora',
        'city' : 'Hermosillo',
        'birthdate' :  date(1990,12,12),
     }
]
 from posts.models import User

for user in users:
     obj = User(**user)
     obj.save()
     print(obj.pk, ':', obj.email) 	

Esta es la herramienta para ver la BD SQLite: https://sqlitebrowser.org/

Insertar usuarios

from datetime import date
users = [
{
'email': '[email protected]',
'password': 'djkhfkshflkshdlfkds',
'first_name': 'Anderson',
'last_name': 'Saavedra',
'country': 'USA',
'city': 'Miami',
'state': 'Florida',
'is_admin': False,
'birthday': date(1994, 2, 12),
'bio': 'LOresjs sndjas sjnfksan jsnfkansk'
},
{
'email': '[email protected]',
'password': 'djkhfkshflkshdlfkds',
'first_name': 'Gabriel',
'last_name': 'Saavedra',
'country': 'USA',
'city': 'Dake',
'state': 'Florida',
'is_admin': False,
'birthday': date(1999, 2, 12),
'bio': 'LOresjs sndjas sjnfksan jsnfkansk'
},
{
'email': '[email protected]',
'password': 'djkhfkshflkshdlfkds',
'first_name': 'Kennedy',
'last_name': 'Saavedra',
'country': 'USA',
'city': 'New York',
'state': 'New York',
'is_admin': False,
'birthday': date(1997, 2, 12),
'bio': 'LOresjs sndjas sjnfksan jsnfkansk'
}
]

from posts.models import User


for user in users:
     obj = User(**user)
     obj.save()
     print(obj.pk, ':', obj.email)```

Hola todos dejo mi código y consultas:

Use las propiedades max_length por el timpo de dato y blanck y nulll para que me permita valores vacios y nulos

por otra parte modifiqué el metodo str para que retornara los datos de city y country.

country=models.CharField(max_length=50,blank=True,null=True)
    city=models.CharField(max_length=50,blank=True,null=True)

def __str__(self) -> str:
        return str(self.email+':'+self.city+':'+self.country)

Actualice los modelos con

python .\manage.py makemigrations
python .\manage.py migrate

Actualice los registros ejecutando los siguientes comando por consola

python .\manage.py shell
from posts.models import user
users.objects.update(country='Colombia')
user.objects.filter(email__endswith='@platzi.com').update(city='bogota')
user.objects.filter(first_name='pablo').update(city='Medellin')

Y utilice los siguinetes comandos para verificar los cambios :

from posts.models import user    platizi_users=user.objects.all()
platizi_users

La salida fue :

<QuerySet [<user: [email protected]:Medellin:Colombia>, <user: [email protected]:bogota:Colombia>, <user: [email protected]:bogota:Colombia>, <user: [email protected]:bogota:Colombia>, <user: [email protected]:bogota:Colombia>]>
users = [
    {
        'email': '[email protected]',
        'first_name': 'otrousuario',
        'last_name': 'Martínez',
        'password': 'msicomputer',
        'is_admin': True,
        'birthdate': date(1981, 11, 6),
        'bio': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
        'country' : "Colombia",
        'city' : "Bogotá"
    },
    {
        'email': '[email protected]',
        'first_name': 'otrousuario1',
        'last_name': 'Martínez',
        'password': 'msicomputer',
        'is_admin': True,
        'birthdate': date(1981, 11, 6),
        'bio': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
        'country' : "Brasil",
        'city' : "Rio de Janiero"
    }
]
for u in users:
    user = User(**u)
    user.save()
    print(user.email)

users = User.objects.all()
users
<QuerySet [<User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>]>

user = User.objects.get(id=1)
user
<User: [email protected]>

Ideas principales de la clase:

Por default django crea un id en nuestra tabla.

Para actualizar nuestros modelos debemos ejecutar

py manage.py makemigratios

El registro de cambios será guardado en el caché de la carpeta migrations.

Para actualizar nuestra DB debemos ejecutar:

py manage.py migrations

Para quienes quieran agregar a El Pepe en su base de datos:

User.objects.create(email='[email protected]', first_name='Pepe', last_name='Nietchz', password='asdf', country='Nicaragua', birthday=date(1555, 5, 25), bio='La mata full de mango, tamo activo papi')

Migraciones

py manage.py makemigrations

Refleja en un archivo los cambios realizados en los modelos

py manage.py migrate

Aplica los cambios en la BD

💚Les comparto una manera de generar usuarios utilizando la librería faker que a mi me funcionó bastante bien💚.

  1. En el entorno virtual instalar faker
pip install Faker
  1. En el shell de Django
#libraries
from posts.models import User
from faker import Faker

#init
fake = Faker()

for i in range(50):
    user = User()
    full_name = fake.name().split(' ')
    user.first_name = full_name[0]
    user.last_name = full_name[1]
    user.email = f'{user.first_name.replace(" ", "_")}@email.com'
    user.password= f'{user.first_name}1234'
    user.bio = fake.text()
    #print(f'first_name: {user.last_name}, last_name{user.last_name}, email: {user.email}, password: {user.password}')
    user.save()

Doc: https://faker.readthedocs.io/en/master/index.html
GitHub: https://github.com/dirias/Curso-de-Django

  1. Agrego con los nuevos campos en la clase User:
country= models.CharField(max_length= 100, null=True)
city= models.CharField(max_length=100, null= True)
  1. Guarda los cambios en tu editor de codigo.
  2. Aplicar los cambios con:
- python manage.py makemigrations.

- python manage.py migrate.
  1. Actualizo algunos usuarios que no tenian el campo country y city anteriormente dentro del shell de Django:
platzi_users = User.objects.filter(email__endswith='@platzi.com')
platzi_users.update(country='Platzilandia')
platzi_users.update(city='Backendcity')
  1. Realizo algunos queries:
>>> platzi_users= User.objects.filter(country__startswith = 'Platzi')
>>> for user in platzi_users:
...     print(user.first_name, '--', user.country, '--', user.city)
...
Christian -- Platzilandia -- Backendcity
Freddy -- Platzilandia -- Backendcity
Yésica -- Platzilandia -- Backendcity
Arturo -- Platzilandia -- Backendcity

Prácticamente, necesitamos entender cómo hacer Querys, para hacer estos mismos con Django.

Update, nos regresa un entero.

Si queremos actualiazar un dato, solo necesitamos especificar a quiénes, para luego utilizar el método update.

Al momento de solicitar varios usuarios, se nos hes devuelto un array, con instancias de los registros que tienen el valor especificado. Lo llaman Queryset. Ahora bien podemos acceder a como lo hace cualquier lista de toda la vida.

Para declarar en un Query, que queremos llamar a un atributo de manera especial, solo tenemos que usar el dunder.

Filter, siempre está esperando por más de una respuesta. Por lo que no está hecho para generar una excepción en caso de que no encuentre algo.

Para obtener varios objetos, con un mismo valor en el mismo atributo, podemos solo cambiar el get, por el filter.

para obtener un registro, solo tenemos que poner: var1 = User.objects.get( El atributo y el valor del registro que queremos) Luego nuestro var1, será un objeto de ese registro, con todos los atributos.

Podemos actualizar los datos de un registro, mediante el misma forma en cómo lo hacemos con los atributos de clase.

objects, es la interface, para hacer objetos de un modelo.

objects, es la interface, para hacer objetos de un modelo.

Para manejar nuestros registros, solo necesitamos instanciar un objeto. Los atributos de este objeto, es como tal, su registro en la base de datos, por lo que podemos acceder a ellos, con solo la dot notation.

Cuando se comienza a fusionar Python con las Bases de Datos Relacionales.

.

# obtener todos los objetos:
 all_entries = Entry.objects.all()

# Filtrar Objetos:
Entry.objects.filter(pub_date__year=2006)
# Filtrar datos con la clase manager:
Entry.objects.all().filter(pub_date__year=2006)

# Obtener solo un elemento con Get():
one_entry = Entry.objects.get(pk=1)

# Hacer una búsqueda con un elemento exacto:
Entry.objects.get(headline__exact="Cat bites dog")

Le ponemos update al filter porque estos son un set, y un método para estos es el update. Ya que las listas son actualizables.

get está hecho para un solo elemento

Lo que te crea el filter es un set.

Tenemos que poner un default a los booleanos.

¿Qué es lo que significa el **Users?

from django.shortcuts import render
from datetime import datetime


posts = [
    {
        'title': 'Mont Blanc',
        'user': {
            'name': 'Yésica Cortés',
            'picture': 'https://picsum.photos/60/60/?image=1027'
        },
        'timestamp': datetime.now().strftime('%b %dth, %Y - %H:%M hrs'),
        'photo': 'https://picsum.photos/800/600?image=1036',
    },
    {
        'title': 'Via Láctea',
        'user': {
            'name': 'Christian Van der Henst',
            'picture': 'https://picsum.photos/60/60/?image=1005'
        },
        'timestamp': datetime.now().strftime('%b %dth, %Y - %H:%M hrs'),
        'photo': 'https://picsum.photos/800/800/?image=903',
    },
    {
        'title': 'Nuevo auditorio',
        'user': {
            'name': 'Uriel (thespianartist)',
            'picture': 'https://picsum.photos/60/60/?image=883'
        },
        'timestamp': datetime.now().strftime('%b %dth, %Y - %H:%M hrs'),
        'photo': 'https://picsum.photos/500/700/?image=1076',
    }
]


def list_posts(request):
    return render(request, 'feed.html', {'posts': posts})
<code>
country = models.CharField(max_length=100, blank=True)
city = models.CharField(max_length=100, blank=True)```

Y para consulta, sólo cambie el "email" por "country" o "city" (:

Que significan los ** antes de la variable user?

es como el sistema de git, algo similar

Si desean cargar un interprete mas completo como en este caso Ipython solo tienen que instalar Ipython dentro de su entorno, yo uso pipenv por lo cual mi instalación particular es

de esta manera el interprete de python queda automáticamente ligado a Ipython, y puede servir para explorar con mayor facilidad las dependencias de las clases que se estén utilizando.

class Countries(models.Model):

    countrie = models.CharField(unique=True, max_length=100)
    capital = models.CharField(max_length=100)
    continent = models.CharField(max_length=100)

    bio = models.TextField(blank=True)

    created = models.DateField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
   
        return self.continent 
    ```

Una pregunta el ORM actualiza si es al revés. Tengo una Base de datos y quisiera importar ese modelo a Django, puedo hacerlo?

Así me quedó el models.py

"""Posts models"""

from django.db import models

class User(models.Model):
    """User model"""

    email = models.EmailField(unique=True)
    password = models.CharField(max_length=100)

    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    is_admin = models.BooleanField(default=False)

    bio = models.TextField(blank=True)

    birthdate = models.DateField(blank=True, null=True)

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    city = models.CharField(max_length=50)
    country = models.CharField(max_length=70)


def __str__(self):
    """return email"""
    return self.email

Lo modifiqué usando esto:

for u in platzi_users:
...     u.city = 'Platzi City'
...     u.country = 'Django'
... 

Y me escupió (xD) esto:

for u in platzi_users:
...     print(u.pk, u.city, u.country)
... 
1 Platzi City Django
2 Platzi City Django
3 Platzi City Django
4 Platzi City Django
>>> 

si no tengo la misma estructura de los datos aún así se guarda?

como haría para borrar un valor de la DB de la lista de diccionarios que ingresamos y luego mostramos con el for user in users.
x ejemplo, si quiero borrar solamente a Freddy.
Como este no fue creado como en el ejemplo de al principio a manera de objeto
Freddy = User() …
Freddy.email = …
etc.

user = User.objects.get() Te permite obtener los valores unitario del registro. Ej: user.first_name pero aquí no puedes usar un update, con filter lo podrás hacer.

user = User.objects.filter(email=‘[email protected]’) Obtienes solo ese registro pero no puedes acceder directamente a sus atributos como con get , aquí deberías de hacer un for loop para recorrer y obtener cada valor.

Buenas tardes,

tengo un problema con una consulta a la base de datos, quiero traer la información de un tabla (A) la cual tiene una pk a otra tabla (B), ahora para obtener el valor correcto de la tabla B, debe verificarse que coincidan 2 valores de la tabla A en la tabla B, pongo el código:

class A(models.Model):
	parametro1:ForeignKey(B)
	parametro2:IntegerField
Class B(models.Model)
	parametro1:IntergerField(pk=True)
	parametro2:IntergerField
	parametro:CharField(**parametro buscado)

no se si me di a explicar, de no ser asi estoy atento, de lo contrario alguien tiene alguna idea de como hacerlo?

Por que cuando hago una modificación en el model.py no me lo permite, no estoy dejando el campo vacio.

Estuvo brutal esta clase jajaja dure dos horas revisando bien todo lo aquí aprendido para entender todo super bien

"""Post.Models"""

# Django
from django.db import models


class User(models.Model):
    """User model"""

    email = models.EmailField(unique=True)
    password = models.CharField(max_length=100)

    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    is_admin = models.BooleanField(default=True)

    bio = models.TextField(blank=True)
    birthday = models.DateField(blank=True, null=True)

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    city = models.CharField(max_length=100, default='Bogotá', blank=False)
    country = models.CharField(max_length=100, default='Colombia', blank=False)

    def __str__(self):
        """REturn email."""
        return self.email

la verdad en mac modo nocturno el software Sqlite Browser no funciona nada bien, podrian recomendarme otro? gracias por el curso

Nunca había usando sqlite pero he quedado bastante complacido en usarla para realizar pruebas cumple bastante bien.

Buenas.
Existe una manera de importar datos a una bd desde una planilla excel?
de ser así mi planilla debe tener los id y pk o debería omitirlos.
de ante mano gracias.

pablo que bien explicado, todo me ha salido bien.

Crear un registro desde terminal:
#python manage.py shell ( Activar terminal )
#from posts.models import User

pablo = User.objects.create(
	email='[email protected]',
	password='1234567',
	first_name='Pablo',
	last_name='Trinidad'
	)

Interesantisima clase

Esta clase fue muy pesada pero muy bien explicada

shell_plus es una bunea consola para estas cosas 😃

los fstring sirven mucho para printear cosas en la shell f"{u.email}: {u.is_admin})"

hmmm alguien ha tocado django con mongodb?

from datetime import date
>>> users = [
...     {
...         'email': '[email protected]',
...         'password': 'No tengo password',
...         'first_name': 'No Tengo',
...         'last_name': 'Nombre Ni Apellido',
...         'bio': 'No tengo una bio, que es eso????',
...         'birthdate': date(1111, 1, 1),    
...     },
...     {
...         'email': '[email protected]',
...         'password': 'Ahi Mary Pili',
...         'first_name': 'Mari',
...         'last_name': 'Pili',
...         'bio': 'Ahi mari pili, Jajajaja',
...         'birthdate': date(1984, 3, 10),    
...     },
... ]

Reto 👨‍💻👨‍💻👨‍💻

from posts.models import User

royer = User.objects.create(email='[email protected]', password='qwerty', first_name='Royer', last_name='Guerrero P', is_admin=True, bio='Programer, Pytonist, Gamer')
maria = User.objects.create(email='[email protected]', password='456545', first_name='Maria', last_name='Pinilla')
albaricoque = User.objects.create(email='[email protected]', password='4752', first_name='Marcos', last_name='Albaricoque', bio=';)')
roberto = User.objects.create(email='[email protected]', password='759851', first_name='Roberto', last_name='Almendro Robles', bio='I\'m not a tree')

users = User.objects.all()
<QuerySet [<User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>]>

user_admin = User.objects.get(is_admin=True) 
user_admin
<User: [email protected]>

user_gmail = User.objects.filter(email__endswith='@gmail.com')
user_gmail
<QuerySet [<User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>]>

En linux con una base de datos mariadb tuve que colocarle max_length=100 al EmailField para poder aplicar el migrate

Al verificar el tipo de la variable “user” con type(user) me arroja la siguiente ruta ‘django.db.models.query.QuerySet’ y no la del modelo, alquien podría ayudarme?

Vamos volando!

Genial, estoy viendo la clase por segunda ves y me quedo claro ahora si, puedo usar cualquier base de datos relacional y las tablas corresponden a los modelos.

Agregando campos a la tabla de la base de datos mediante la clase User

country = models.CharField(max_length=100, default="USA")
city = models.CharField(max_length=100, default="Miami")
state = models.CharField(max_length=100, default='Florida')```

Activar el shell en el cmd.

python3 manage.py shell

luego
```python3 manage.py makemigrations```

Migrar a la base de datos
```python3 manage.py migrate```

Consultas para traer a los admin

>>> for user in admin_users:
...     print(user.email, ', administrador:', user.is_admin)
...
[email protected].com , administrador: True
[email protected].com , administrador: True
[email protected].com , administrador: True
[email protected].com , administrador: True```

Recomiendo esta Documentacion para complementar para aquellos que vayan a usar MySql.

Digital Ocean Doc

La lógica de consulta e inserción de datos se debería hacer desde los Views de cada app?

Los Migrations se parecen mucho al funcionamiento de “add” y “commit” en Git

Estoy interesada en profundizar en el ORM de Django, ¿alguien conoce algún recurso?. Me gustaría poder ver como traducir el ORM de SQLAlchemy al ORM de Django.

Para evitar abrir db.sqlite3 cada vez que se realiza una migración, con F5 basta para ver reflejados los cambios en la BD.

RETO CUMPLIDO!
Buscando en la doc encontre como trabajar las FK desde django.

"""
Modelos del post
"""

from django.db import models


class Countries(models.Model):
    """Country Model"""
    country_name = models.CharField(max_length=3)

    




class User(models.Model):
    """User Model"""

    #Django adds default id to the class

    email = models.EmailField(unique=True)
    password = models.CharField(max_length=100)

    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    
    bio = models.TextField(blank=True)


    is_admin = models.BooleanField(default=False)


    birthday = models.DateField(blank=True, null=True)

    # DateTime Almacena tambien la hora
    # cuando se crea 
    created_at = models.DateTimeField(auto_now_add=True)
    # cuando se modifica
    modified_at = models.DateTimeField(auto_now=True)
    
    city = models.CharField(max_length=100, default="NO REGISTERS")
    country = models.ForeignKey(Countries, on_delete="SET NULL", null=True)

El ORM de django es genial!! Mas cuando lo explica Pablo 😄

Reto de la clase:

  • Creación de campos:
    city = models.CharField(max_length=100, blank=True)
    country = models.CharField(max_length=100, blank=True)
  • Reflejar los cambios del modelo en la BD:
python manage.py makemigrations
python manage.py migrate
  • Consultas:
from posts.models import User

# Actualizar datos del registro 1
user = User.objects.get(pk=1)
user.city = 'Loja'
user.country = 'Ecuador'
user.save()

# Actualizar country de los usuarios Platzi
platzi_users = User.objects.filter(email__endswith='@platzi.com')
platzi_users.update(country='Colombia')

# Creación de un nuevo registro
user = User.objects.create(email='[email protected]', password='123456789', first_name='Ale', last_name='Sánchez', is_admin=True, city='Quito', country='Ecuador')