Pergunta

Existe suporte explícito para Herança de Tabela Única em Django? Última vez que ouvi, o recurso ainda estava em desenvolvimento e debate.

Existem bibliotecas / hacks eu posso usar, entretanto, para capturar o comportamento básico? Eu tenho uma hierarquia que mistura objetos diferentes. O exemplo canônico de uma estrutura de corporação com uma classe Employee, subclasses para os tipos de funcionários, e uma manager_id (parent_id) seria uma boa aproximação do problema estou resolvendo.

No meu caso, eu gostaria de representar a idéia de que um empregado pode gerenciar outros funcionários enquanto está a ser gerida por um funcionário diferente. Não há classes separadas para gerente e do trabalhador, o que torna isso difícil de espalhados por mesas. Sub-classes que representam tipos de funcionários-programadores, contadores, vendas, etc e seria independente que supervisiona que (OK, eu acho que ele não é mais uma empresa típica em algum aspecto).

Foi útil?

Solução

Atualmente existem duas formas de herança em Django -. MTI (modelo de mesa herança) e ABC (classes de base abstrata)

Eu escrevi um tutorial sobre o que está acontecendo sob o capô.

Você também pode referenciar os documentos oficiais sobre modelo de herança .

Outras dicas

Eu acho que o OP é perguntando sobre Single-Table Inheritance como definido aqui :

Bancos de dados relacionais não suportam herança, por isso, quando o mapeamento de objetos para bancos de dados que temos de considerar como representar as nossas estruturas de herança agradáveis ??em tabelas relacionais. Ao mapear a um banco de dados relacional, tentamos minimizar a junta que pode rapidamente montar-se ao processar uma estrutura de herança em várias tabelas. Herança de Tabela Única mapeia todos os campos de todas as classes de uma estrutura de herança em uma única tabela.

Isto é, uma tabela de banco de dados único para toda uma hierarquia de classes de entidade. O Django não suportar esse tipo de herança.

Veja a minha tentativa:

http://djangosnippets.org/snippets/2408/

Uma emulação de "tabela por hierarquia" A.K.A. "herança única tabela" em Django. A classe base deve conter todos os campos. É subclasses não são permitidos para conter todos os campos adicionais e de forma otimizada eles devem ser proxies.

Não exatamente "herança única tabela", mas perto o suficiente para muitas situações.

Eu acho que você pode fazer algo parecido com isso.

Eu tenho que implementar uma solução para este problema sozinho, e aqui foi como eu resolver isso:

class Citrus(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager)
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')

class Tangelo(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()
    objects = TangeloManager()
    class Meta:
        # 'appname' below is going to vary with the name of your app
        db_table = u'appname_citrus'

Isto pode ter alguns problemas de bloqueio ... Eu realmente não estou certo como o Django alças que em cima da minha cabeça. Além disso, eu realmente não testar o código acima, é estritamente para fins de entretenimento, para colocá-lo esperançosamente no caminho certo.

isso pode ser de uso: https://github.com/craigds/django-typed- modelos Parece ser um pouco de uma implementação de Herança de Tabela Única mas tem a limitação que subclasses não pode ter quaisquer campos extras.

há também uma bifurcação que aborda o problema de não ser capaz de criar campos extras: https://github.com/KrzysiekJ/django-typed-models

Atualização: Eu acredito que o garfo pode ter sido mescladas de volta no

aqui é uma discussão recente na lista de discussão de desenvolvedores Django sobre STI: https://groups.google.com/forum/#! msg / django-desenvolvedores / -UOM8HNUnxg / 6k34kopzerEJ

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top