Django - Modelos
Um modelo é uma classe que representa a tabela ou coleção em nosso banco de dados, e onde cada atributo da classe é um campo da tabela ou coleção. Os modelos são definidos em app / models.py (em nosso exemplo: myapp / models.py)
Criando um modelo
A seguir está um modelo Dreamreal criado como exemplo -
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"
Todo modelo herda de django.db.models.Model.
Nossa classe possui 4 atributos (3 CharField e 1 Integer), esses serão os campos da tabela.
A classe Meta com o atributo db_table nos permite definir a tabela real ou o nome da coleção. Django nomeia a tabela ou coleção automaticamente: myapp_modelName. Esta classe permitirá que você force o nome da tabela de acordo com sua preferência.
Existem mais tipos de campo em django.db.models, você pode aprender mais sobre eles em https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types
Depois de criar seu modelo, você precisará do Django para gerar o banco de dados real -
$python manage.py syncdb
Manipulando dados (CRUD)
Vamos criar uma visão "crudops" para ver como podemos fazer operações CRUD nos modelos. Nosso myapp / views.py se parecerá com -
myapp/views.py
from myapp.models import Dreamreal
from django.http import HttpResponse
def crudops(request):
#Creating an entry
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)
Outra manipulação de dados
Vamos explorar outras manipulações que podemos fazer em modelos. Observe que as operações CRUD foram feitas em instâncias de nosso modelo, agora estaremos trabalhando diretamente com a classe que representa nosso modelo.
Vamos criar uma visão de 'manipulação de dados' em myapp/views.py
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)
Modelos de ligação
Django ORM oferece 3 maneiras de vincular modelos -
Um dos primeiros casos que veremos aqui são os relacionamentos um-para-muitos. Como você pode ver no exemplo acima, a empresa Dreamreal pode ter vários sites online. A definição dessa relação é feita usando django.db.models.ForeignKey -
myapp/models.py
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"
Como você pode ver em nosso myapp / models.py atualizado, adicionamos o modelo online e o vinculamos ao nosso modelo Dreamreal.
Vamos verificar como tudo isso está funcionando via shell manage.py -
Primeiro, vamos criar algumas empresas (entradas Dreamreal) para testar em nosso shell Django -
$python manage.py shell
>>> from myapp.models import Dreamreal, Online
>>> dr1 = Dreamreal()
>>> dr1.website = 'company1.com'
>>> dr1.name = 'company1'
>>> dr1.mail = '[email protected]'
>>> dr1.phonenumber = '12345'
>>> dr1.save()
>>> dr2 = Dreamreal()
>>> dr1.website = 'company2.com'
>>> dr2.website = 'company2.com'
>>> dr2.name = 'company2'
>>> dr2.mail = '[email protected]'
>>> dr2.phonenumber = '56789'
>>> dr2.save()
Agora, alguns domínios hospedados -
>>> 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()
O acesso ao atributo da empresa de hospedagem (entrada Dreamreal) de um domínio online é simples -
>>> on1.company.name
E se quisermos saber todo o domínio online hospedado por uma empresa no Dreamreal usaremos o código -
>>> dr1.online_set.all()
Para obter um QuerySet, observe que todos os métodos de manipulação que vimos antes (filtrar, todos, excluir, pedido_por ....)
Você também pode acessar os atributos do modelo vinculado para operações de filtragem, digamos que você deseja obter todos os domínios online onde o nome Dreamreal contém 'empresa' -
>>> Online.objects.filter(company__name__contains = 'company'
Note- Esse tipo de consulta é compatível apenas com o banco de dados SQL. Não funcionará para BD não relacional onde não existem junções e há dois '_'.
Mas essa não é a única forma de vincular modelos, você também tem OneToOneField, um link que garante que a relação entre dois objetos seja única. Se usarmos OneToOneField em nosso exemplo acima, isso significaria que para cada entrada do Dreamreal apenas uma entrada online é possível e de outra forma.
E o último, o ManyToManyField for (nn) relação entre tabelas. Observe que eles são relevantes para bancos de dados baseados em SQL.