Changes between Initial Version and Version 1 of ComoHerdarClassesDeModelo


Ignore:
Timestamp:
Sep 23, 2008, 6:38:43 AM (16 years ago)
Author:
Marinho Brandão
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ComoHerdarClassesDeModelo

    v1 v1  
     1= Como herdar Classes de Modelo =
     2
     3A herança entre classes de modelo pode ser muito útil, especialmente para duas coisas:
     4
     5 * manter uma referência única para um conjunto de funcionalidades compartilhadas por mais de uma classe de modelo;
     6 * gravar informações similares em uma estrutura hierárquica sem aumentar a complexidade.
     7
     8O Django trabalha com herança de classes de modelo de duas formas diferentes:
     9
     10 * '''Herança de classe abstrata''' - uma classe abstrata não possui tabela no banco de dados, portanto, as classes que herdam dela criam seus campos na própria tabela;
     11 * '''Herança de classe não-abstrata''' - a classe herdada possui sua própria tabela, com os dados centralizados ali, e as classes extendidas criam apenas seus próprios campos e uma referência ao registro da tabela da classe herdada.
     12
     13== Herança de Classes Abstratas ==
     14
     15Vamos supor que você possua uma aplicação chamada "pessoas", que possui duas classes: '''Cliente''' e '''Funcionario''', que compartilham alguns campos, comuns de pessoas, como '''nome''', '''data_nascimento''' e '''endereco'''. Nesse caso, ter uma classe '''abstrata''', que centralize os campos referentes a uma pessoa, pode ser bastante útil para você compartilhar funcionalidades referentes a esses campos e manter a coesão dos dados. Entretanto, os campos existirão tanto na tabela de clientes, quanto na de funcionários.
     16
     17Para fazer a estrutura citada acima, escreva o código abaixo no arquivo '''models.py''' da aplicação:
     18
     19{{{
     20from django.db import models
     21
     22class Pessoa(models.Model):
     23    class Meta:
     24        abstract = True
     25
     26    nome = models.CharField(max_length=100)
     27    data_nascimento = models.DateField()
     28    endereco = models.CharField(max_length=100)
     29
     30class Cliente(Pessoa):
     31    compra_sempre = models.BooleanField(default=False)
     32
     33class Funcionario(Pessoa):
     34    ctps = models.CharField(max_length=25)
     35    salario = models.DecimalField(max_digits=15, decimal_places=2)
     36}}}
     37
     38Agora, ao rodar o comando para criar as tabelas, veja que somente as tabelas de Cliente e Funcionario são criadas:
     39
     40{{{
     41$ python manage.py syncdb
     42Creating table pessoas_cliente
     43Creating table pessoas_funcionario
     44}}}
     45
     46== Herança de Classes Não-Abstratas ==
     47
     48Supondo agora que essa mesma aplicação possua uma classe chamada '''LigacaoTelefonica''', que pode ser classificada de duas formas: '''LigacaoTelefonicaComum''' e '''LigacaoTelefonicaACobrar'''. Você quer ter o poder de resgatar listagens de ligações telefônicas de um tipo específico ou de ambos.
     49
     50Este é o caso para uma herança de classe não-abstrata. Pois a classe LigacaoTelefonica continuará existindo com todos os atributos e funcionalidades de uma classe persistente comum. E o resultado final serão 3 tabelas, uma para cada classe.
     51
     52Para isso, escreva o código abaixo no arquivo '''models.py''' de sua aplicação:
     53
     54{{{
     55from django.db import models
     56
     57class LigacaoTelefonica(models.Model):
     58    numero_origem = models.CharField(max_length=25)
     59    numero_destino = models.CharField(max_length=25)
     60    data_hora = models.DateTimeField()
     61
     62class LigacaoTelefonicaComum(LigacaoTelefonica):
     63    operadora = models.PositiveIntegerField()
     64
     65class LigacaoTelefonicaACobrar(LigacaoTelefonica):
     66    motivo = models.CharField(max_length=100)
     67}}}
     68
     69Agora veja o resultado final, ao criar as tabelas:
     70
     71{{{
     72$ python manage.py syncdb
     73Creating table pessoas_ligacaotelefonica
     74Creating table pessoas_ligacaotelefonicacomum
     75Creating table pessoas_ligacaotelefonicaacobrar
     76}}}
     77
     78Note que foram criadas as 3 tabelas.
     79
     80----
     81Tire outras dúvidas em nosso [wiki:CookBookPortugues CookBook em Português]
Back to Top