| | 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] |