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

Modelos (Model) Django

O modelo é uma classe que representa nossa tabela ou coleção de banco de dados, e cada propriedade dessa classe é um campo da tabela ou coleção. O modelo está no app/definido em models.py (no nosso exemplo é: myapp/models.py)

Criar modelo

Abaixo está a criação de uma instância de modelo Dreamreal -

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 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 herda de django.db.models.Model.

Nossa classe tem4uma propriedade (3 CharField e1um inteiro), isso será o campo na tabela.

A classe Meta e a propriedade db_table nos permitem definir o nome real da tabela ou coleção. O Django nomeia automaticamente a tabela ou coleção: myapp_modelName. Essa classe força o nome da tabela.

No django.db.models, mais tipos de campos, você pode saber mais sobre eles pelo URL:

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

Depois de criar o modelo, é necessário que o Django gere o banco de dados real -

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
$python manage.py syncdb

Operações de dados (CRUD)

Vamos criar uma visão 'crudops' para ver como podemos fazer operações CRUD no modelo. Agora no myapp/views.py e em seguida, o que parece com -

myapp/views.py

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def crudops(request):
    #Criando uma 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)

Outras operações de dados

Vamos explorar outras operações que podemos fazer com o modelo. É importante notar que as operações CRUD são feitas em instâncias do modelo, e agora vamos diretamente representar o funcionamento da classe do modelo.

Vamos criar uma vista "datamanipulation" no myapp/views.py

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 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 += "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)

ligação de modelos

O Django ORM oferece3esta forma para conectar os modelos -

A primeira coisa que veremos aqui é um exemplo de relação um-para-muitos. Como visto no exemplo acima, uma empresa pode ter vários sites online. Essa relação é definida usando django.db.models.ForeignKey -

myapp/models.py

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 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"

Pode atualizar o myapp/models.py, como você vê, adicionamos um modelo online e o ligamos ao modelo Dreamreal.

Vamos ver como executar todas as tarefas através do shell manage.py -

Primeiro vamos testar o shell do Django para criar algumas empresas (itens Dreamreal) -

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
$python manage.py shell
 >>> from myapp.models import Dreamreal, Online
 >>> dr1 = Dreamreal()
 >>> dr1.website = 'company1.com'
 >>> dr1.name = 'company1'
 >>> dr1.mail = 'contact@company1'
 >>> dr1.phonenumber = '12345'
 >>> dr1.save()
 >>> dr2 = Dreamreal()
 >>> dr1.website = 'company2.com'
 >>> dr2.website = 'company2.com'
 >>> dr2.name = 'company2'
 >>> dr2.mail = 'contact@company2'
 >>> dr2.phonenumber = '56789'
 >>> dr2.save()

Agora há alguns domínios de representação -

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
>>> on1 = Online()
 >>> on1.company = dr1
 >>> on1.domain = "site1.com"
 >>> on2 = Online()
 >>> on2.company = dr1
 >>> on2.domain = "site2.com"
 >>> on3 = Online()
 >>> on3.domain = "site3.com"
 >>> dr2 = Dreamreal.objects.all()[2]
 >>> on3.company = dr2
 >>> on1.save()
 >>> on2.save()
 >>> on3.save()

Acesso às propriedades da empresa hospedada pelo domínio online (item Dreamreal) é simples -

 # Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
>>> on1.company.name

Se quiser saber todos os domínios online hospedados pelo Dreamreal da empresa, usaremos o código -

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
>>> dr1.online_set.all()

Para obter um QuerySet, note que todas as operações que vimos antes (filter, all, exclude, order_by...)

Também pode acessar para operações de filtragem de propriedades de modelo, por exemplo, para obter todos os domínios online em Dreamreal cujo nome contém "company"-

# Nome do arquivo: example.py
# Copyright: 2020 Por w3codebox
# Autor por: pt.oldtoolbag.com
# Data: 2020-08-08
>>> Online.objects.filter(company__name__contains='company'

Nota - Essa consulta suporta apenas bancos de dados SQL. Não funciona em bancos de dados não relacionais, onde não há conexão e existem dois "_".

Mas, isso não é a única maneira de ligar modelos, também há OneToOneField, que garante que o relacionamento entre dois objetos seja um vínculo único. Se usar OneToOneField no exemplo acima, isso significa que há apenas uma entrada online correspondente a cada entrada Dreamreal.

O último, esses relacionamentos ManyToManyField entre tabelas são baseados no banco de dados SQL.