Herança única tabela no Django

votos
20

Existe apoio explícito à herança única tabela 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 se espalhar através de tabelas. 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).

Publicado 27/10/2008 em 21:18
fonte usuário
Em outras línguas...                            


5 respostas

votos
16

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, 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 única tabela mapeia todos os campos de todas as classes de uma estrutura de herança em uma única tabela.

Ou seja, 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.

Respondeu 12/11/2009 em 09:25
fonte usuário

votos
16

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 herança modelo .

Respondeu 28/10/2008 em 15:29
fonte usuário

votos
3

Veja minha tentativa:

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

Uma emulação de "tabela por hierarquia" aka "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.

Respondeu 11/04/2011 em 02:00
fonte usuário

votos
2

isso pode ser de uso: https://github.com/craigds/django-typed-models 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

update: Eu acredito que o garfo pode ter sido mescladas de volta em

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

Respondeu 02/02/2013 em 13:31
fonte usuário

votos
1

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 não sou realmente certo como Django lida com que fora do topo 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.

Respondeu 05/03/2010 em 01:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more