| 1 | = Como herdar Classes de Modelo = |
| 2 | |
| 3 | A 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 | |
| 8 | O 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 | |
| 15 | Vamos 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 | |
| 17 | Para fazer a estrutura citada acima, escreva o código abaixo no arquivo '''models.py''' da aplicação: |
| 18 | |
| 19 | {{{ |
| 20 | from django.db import models |
| 21 | |
| 22 | class 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 | |
| 30 | class Cliente(Pessoa): |
| 31 | compra_sempre = models.BooleanField(default=False) |
| 32 | |
| 33 | class Funcionario(Pessoa): |
| 34 | ctps = models.CharField(max_length=25) |
| 35 | salario = models.DecimalField(max_digits=15, decimal_places=2) |
| 36 | }}} |
| 37 | |
| 38 | Agora, 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 |
| 42 | Creating table pessoas_cliente |
| 43 | Creating table pessoas_funcionario |
| 44 | }}} |
| 45 | |
| 46 | == Herança de Classes Não-Abstratas == |
| 47 | |
| 48 | Supondo 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 | |
| 50 | Este é 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 | |
| 52 | Para isso, escreva o código abaixo no arquivo '''models.py''' de sua aplicação: |
| 53 | |
| 54 | {{{ |
| 55 | from django.db import models |
| 56 | |
| 57 | class 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 | |
| 62 | class LigacaoTelefonicaComum(LigacaoTelefonica): |
| 63 | operadora = models.PositiveIntegerField() |
| 64 | |
| 65 | class LigacaoTelefonicaACobrar(LigacaoTelefonica): |
| 66 | motivo = models.CharField(max_length=100) |
| 67 | }}} |
| 68 | |
| 69 | Agora veja o resultado final, ao criar as tabelas: |
| 70 | |
| 71 | {{{ |
| 72 | $ python manage.py syncdb |
| 73 | Creating table pessoas_ligacaotelefonica |
| 74 | Creating table pessoas_ligacaotelefonicacomum |
| 75 | Creating table pessoas_ligacaotelefonicaacobrar |
| 76 | }}} |
| 77 | |
| 78 | Note que foram criadas as 3 tabelas. |
| 79 | |
| 80 | ---- |
| 81 | Tire outras dúvidas em nosso [wiki:CookBookPortugues CookBook em Português] |