English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Modelo (Model) de Django

El modelo es una clase que representa nuestra tabla o colección de base de datos, y cada propiedad de la clase es un campo de la tabla o colección. El modelo está en/definido en models.py (en nuestro caso es: myapp/models.py)

Crear modelo

A continuación, se muestra la creación de una instancia de modelo Dreamreal -

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
from django.db import models
 class Dreamreal(models.Model):
    website = models.CharField(max_length = 50)
    mail = models.CharField(max_length = 50)
    name = models.CharField(max_length = 50)
    phonenumber = models.IntegerField()
    class Meta:
       db_table = "dreamreal"

Cada modelo hereda de django.db.models.Model.

Nuestra clase tiene4una propiedad (3 CharField y1un entero), esto será el campo de la tabla.

La clase Meta y la propiedad db_table nos permiten definir el nombre real de la tabla o colección. Django nombrará automáticamente la tabla o colección: myapp_modelName. Esta clase forzará el nombre de la tabla.

En django.db.models, puedes encontrar más tipos de campos y obtener más información sobre ellos en la URL:

https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Después de crear el modelo, Django necesita generar la base de datos real -

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
$python manage.py syncdb

Operaciones de datos (CRUD)

Vamos a crear una vista de "crudops" para ver cómo se pueden realizar operaciones CRUD en el modelo. Ahora myapp/views.py luego parece que -

myapp/views.py

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def crudops(request):
    #Creando una entrada
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    #Read ALL entries
    objects = Dreamreal.objects.all()
    res = 'Printing all Dreamreal entries in the DB: <br>'
    for elt in objects:
       res +elt.name+"<br>"
    #Read a specific entry:
    sorex = Dreamreal.objects.get(name = "sorex")
    res += 'Printing One entry <br>'
    res += sorex.name
    #Delete an entry
    res += '<br> Deleting an entry <br>'
    sorex.delete()
    #Update
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    res += 'Updating entry<br>'
    dreamreal = Dreamreal.objects.get(name = 'sorex')
    dreamreal.name = 'thierry'
    dreamreal.save()
    return HttpResponse(res)

Otras operaciones de datos

Vamos a explorar otras operaciones que se pueden realizar en el modelo. Es importante notar que las operaciones CRUD se realizan en instancias del modelo, y ahora directamente representaremos el funcionamiento de la clase del modelo.

Vamos a crear una vista "datamanipulation" en myapp/views.py

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def datamanipulation(request):
    res = ''
    #Filtering data:
    qs = Dreamreal.objects.filter(name = "paul")
    res +qs = "Found : %s results<br>"%len(qs)
    #Ordering results
    qs = Dreamreal.objects.order_by("name")
    for elt in qs:
       res +elt.name + '<br>'
    return HttpResponse(res)

enlazar modelos

Django ORM proporciona3esta manera para enlazar modelos −

El primer ejemplo que veremos aquí será una relación uno-a-muchos. Como se ve en el ejemplo anterior, una empresa puede tener varios sitios en línea. Esta relación se define utilizando django.db.models.ForeignKey -

myapp/models.py

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
from django.db import models
 class Dreamreal(models.Model):
    website = models.CharField(max_length = 50)
    mail = models.CharField(max_length = 50)
    name = models.CharField(max_length = 50)
    phonenumber = models.IntegerField()
    online = models.ForeignKey('Online', default = 1)
    class Meta:
       db_table = "dreamreal"
 class Online(models.Model):
       domain = models.CharField(max_length = 30)
    class Meta:
       db_table = "online"

Se puede actualizar myapp/models.py, como puedes ver, hemos agregado un modelo en línea y lo hemos enlazado al modelo Dreamreal.

Vamos a ver cómo se ejecuta todo mediante el shell de manage.py −

Primero, vamos a probar el shell de Django para crear algunas empresas (elementos Dreamreal) −

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
$python manage.py shell
 >>> from myapp.models import Dreamreal, Online
 >>> dr1 = Dreamreal()
 >>> dr1.website = 'company'1.com'
 >>> dr1.name = 'company'1'
 >>> dr1.mail = 'contact@company'1'
 >>> dr1.phonenumber = '12345'
 >>> dr1.save()
 >>> dr2 = Dreamreal()
 >>> dr1.website = 'company'2.com'
 >>> dr2.website = 'company'2.com'
 >>> dr2.name = 'company'2'
 >>> dr2.mail = 'contact@company'2'
 >>> dr2.phonenumber = '56789'
 >>> dr2.save()

Ahora hay algunos dominios de redirigimiento −

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
>>> on1 = Online()
 >>> on1.company = dr1
 >>> on1.domain = "site"1.com"
 >>> on2 = Online()
 >>> on2.company = dr1
 >>> on2.domain = "site"2.com"
 >>> on3 = Online()
 >>> on3.domain = "site"3.com"
 >>> dr2 = Dreamreal.objects.all()[2]
 >>> on3.company = dr2
 >>> on1.save()
 >>> on2.save()
 >>> on3.save()

Es muy simple acceder a las propiedades de la empresa anfitriona (Dreamreal item) desde el dominio en línea -

 # Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
>>> on1.company.name

Si desea saber todos los dominios en línea que organiza la empresa Dreamreal, utilizaremos el código -

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
>>> dr1.online_set.all()

Para obtener un QuerySet, note que todos los métodos de operación, hemos visto antes (filter, all, exclude, order_by...)

También se puede acceder a operaciones de filtrado de propiedades de enlace de modelo, por ejemplo, para obtener todos los dominios en línea en Dreamreal cuyos nombres contienen 'company'-

# Nombre de archivo: example.py
# Derechos de autor: 2020 Por w3codebox
# Autor por: es.oldtoolbag.com
# Fecha: 2020-08-08
>>> Online.objects.filter(company__name__contains='company'

Nota - Esa consulta solo admite bases de datos SQL. No funciona en bases de datos no relacionales, donde no existe una conexión y hay dos '_'.

Pero, esto no es la única manera de enlazar modelos, también hay OneToOneField, que asegura que la relación entre dos objetos es un vínculo único. Si se usa OneToOneField en el ejemplo anterior, esto significa que solo hay una entrada en línea correspondiente a cada entrada Dreamreal.

Finalmente, las relaciones ManyToManyField entre tablas (NN) son todas basadas en bases de datos SQL.