Herança no Django (Model Inheritance)

Recentemente estava trabalhando com herança de modelos no Django (model inheritance para os estrangeiros) e precisei saber, à partir da classe mãe, qual era a classe filha.

Até então não tinha me preocupado como funcionam as “entranhas” do Django pra dar suporte à herança de modelos, é interessante.

Os dados da classe mãe são salvos em uma tabela, e os das filhas em outra, uma nova tabela para cada filha. Quando é carregada uma instância da classe filha, ela traz consigo os dados herdados da mãe (através de um JOIN no banco). Já a mãe pode ser chamada de desnaturada, não é muito boa para achar suas filhas.

Então o que eu fiz foi adicionar uma relação genérica à classe mãe e alterar o método save para relacionar à classe filha apenas gravando o content-type, assim eu consegui fazer a família se comunicar melhor.

Depois que postei no Django Snippets vi que mais gente tinha feito algo parecido, mas eu juro que só vi depois!🙂

De qualquer forma, aí vai:

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Place(models.Model):
    name = models.CharField('name')
    content_type = models.ForeignKey(ContentType)
    # Child model
    child = generic.GenericForeignKey(fk_field='id')

    def save(self, **kwargs):
        if not self.pk:
            self.content_type = ContentType.objects.get_for_model(self)
        super(Place, self).save(**kwargs)

class Restaurant(Place):
    pass

Ou veja no Django Snippets, lá fica mais bonito: Child aware model inheritance.

Tem algumas variações aqui.

Sobre Rico
Software engineer

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: