junção externa completa no Django

votos
8

Como posso criar uma consulta para uma associação externa completa através de uma relationchip M2M usando a API do Django QuerySet?

É que não é suportado, alguma dica sobre como criar meu próprio gerente para fazer isso seria bem-vindo.

Editado para acrescentar: @ S. Lott: Obrigado pelo esclarecimento. A necessidade de junção externa vem da aplicação. Tem que gerar um relatório mostrando os dados inseridos, mesmo que ainda incompleta. Eu não estava ciente do fato de que o resultado seria uma nova classe / modelo. Suas dicas vai me ajudar um pouco.

Publicado 31/10/2008 em 10:46
fonte usuário
Em outras línguas...                            


2 respostas

votos
11

O Django não suportar "junta-se" no sentido SQL costume - ele suporta navegação de objetos.

Note que uma relacional join (interna ou externa) cria uma nova "classe" de entidades. Um que não tem uma definição em Django. Portanto, não há adequada "conjunto de resultados", já que não há nenhuma definição de classe para as coisas que você recebe de volta. O melhor que você pode fazer é definir uma tupla que será embalado com Nenhum de para combinações faltando.

A externa esquerda (ou direita) juntar-se parece com isso. Ele cria dois subconjuntos disjuntos, aqueles que têm associado um conjunto de entidades relacionadas, e aqueles que não o fazem.

for obj in Model1.objects.all():
    if obj.model2_set().count() == 0:
        # process (obj, None) -- no Model2 association
    else:
        for obj2 in obj.model2_set.all():
            # process (obj, obj2) -- the "inner join" result

Um exterior "Full" juntar-se é uma união dos itens restantes que não têm relacionamentos.

for obj2 in Model2.objects.all():
    if obj2.model1_set().count() == 0:
        # process (None, obj2) -- no Model1 association

A questão é sempre, o processamento que você está fazendo com esta coleção estranha de três diferentes subconjuntos de objetos?

O ponto de um banco de dados objeto é focar o processamento no objeto e é objetos associados.

A coleção peculiar chamado de "relacional juntar" nunca está no modelo de objeto original. É uma nova classe de objetos construídos a partir de duas (ou mais) objetos originais.

Pior, junções externas criar uma coleção com várias subclasses (junção interna, externa à esquerda e à direita junção externa). O que isso coleção de coisas significam ?

Espere, ele pode ficar pior. Se o processamento inclui verificações para os atributos ausentes (ou seja if someObj.anObj2attribute is None: estamos essencialmente à procura de Model1itens sem Model2. Objeto associado Ummm ... por que nós colocamos aqueles no junção externa, só para filtrá-los usando uma ifdeclaração Porque não basta fazer? consultas separadas processo amd cada subconjunto corretamente?


Edit: Quando você está mostrando o status "incompleto", não é uma união exterior em tudo. É muito mais simples. Você precisa criar um (ou dois) coleções separadas em sua função de visualização para o seu modelo para exibir.

Primeiro, você deve usar códigos de estado, não a presença ou ausência de uma chave estrangeira. chaves estrangeiras opcionais não têm "razões" - eles estão ou não existe ou não. Um código de status pode fornecer tons úteis de significado ( "incompleto", "em erro", "quebrado", "não aplicável", "a ser eliminado", etc.)

errorList1 = Model1.objects.filter( status="Incomplete" )
errorList2 = Model2.objects.filter( status="Incomplete" )

Estes dois são os dois-join não partes de uma junção externa completa. Você pode então exibir essas duas listas de erros em seu modelo com títulos de coluna apropriados e códigos de status e tudo.

Você mesmo pode colocá-los em uma única tabela para imitar o antigo junção externa completa do relatório as pessoas costumavam ver

<table>
    <tr><th>Model1</th><th>Model2</th></tr>
    {% for e1 in errorList1 %}
    <tr><td>e1</td><td>NULL</td></tr>
    {% endfor %}
    {% for e2 in errorList2 %}
    <tr><td>NULL</td><td>e2</td></tr>
    {% endfor %}
</table>

Parece uma junção externa completa relatório. Sem a junção externa completa.

Respondeu 31/10/2008 em 11:23
fonte usuário

votos
1

Colin, um dos caras com quem trabalho, escreveu um post algum tempo atrás sobre fazer costume junta no Django:

http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

Você pode ser capaz de encontrar algo útil lá!

Respondeu 12/03/2010 em 02:14
fonte usuário

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