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.