Jointure externe complète dans django
Comment puis-je créer une requête pour une jointure externe complète à travers une M2M relationchip à l'aide de l'django QuerySet API?
Ce qui n'est pas pris en charge, un indice sur la création de mon propre manager pour ce faire serait la bienvenue.
Modifiées afin d'ajouter:
@S. Lott:
Merci pour le siècle des lumières.
La nécessité pour la JOINTURE EXTERNE provient de l'application. Il doit générer un rapport présentant les données saisies, même si c'est encore incomplète.
Je n'étais pas conscient du fait que le résultat en serait une nouvelle classe de modèle. Vos conseils vont m'aider un peu.
OriginalL'auteur Ber | 2008-10-31
Vous devez vous connecter pour publier un commentaire.
Django ne supporte pas les "jointures" dans l'habitude de SQL sens -- il prend en charge la navigation d'objet.
Noter qu'une jointure relationnelle (intérieure ou extérieure) crée une nouvelle "classe" des entités. Celui qui ne possède pas une définition dans Django. Donc il n'y a pas de "jeu de résultats" car il n'y a pas de définition de classe pour les choses que vous obtenez en retour. Le meilleur que vous pouvez faire est de définir un tuple qui seront emballés avec Aucun pour manque de combinaisons.
À gauche (ou à droite) de la jointure externe ressemble à ceci. Il crée deux sous-ensembles disjoints, ceux qui sont associés à un ensemble d'entités liées, et ceux qui n'en ont pas.
Un "Plein" de la jointure externe est une union des éléments restants qui n'ont pas de relations.
La question est toujours, que le traitement que tu fais avec cette étrange collection de trois différents sous-ensembles d'objets?
Le point d'un objet de base de données est de se concentrer le traitement sur l'objet et les objets associés.
La particularité de la collection appelée "relationnel rejoindre" n'est jamais dans l'objet d'origine du modèle. C'est une nouvelle classe d'objets construits à partir de deux (ou plus) objets d'origine.
Pire, les jointures externes de créer une collection avec plusieurs sous-classes (inner join, left outer join et right outer join). Ce n'est que la collection de choses dire?
Attendre, elle peut s'aggraver. Si le traitement comprend des contrôles pour les attributs manquants (c'est à dire
if someObj.anObj2attribute is None
: nous sommes essentiellement à la recherche pourModel1
les éléments sansModel2
objet associé. Ummm... pourquoi avons-nous de les placer dans la jointure externe, uniquement pour les filtrer à l'aide d'unif
déclaration? Pourquoi ne pas séparer les requêtes amd processus de chaque sous-ensemble correctement?Edit: Quand vous êtes montrant "incomplet" de statut, il n'est pas un outer-join. C'est beaucoup plus simple. Vous avez besoin de créer un (ou deux) collections distinctes dans votre vue en fonction de votre modèle d'affichage.
Tout d'abord, vous devez utiliser les codes d'état, non pas de la présence ou de l'absence d'une clé étrangère. Facultatif clés étrangères n'ont pas de "raisons" -- ils sont là ou pas là. Un code d'état peut fournir des nuances de sens ("incomplet", "dans l'erreur", "broken", "non applicable", "être supprimé", etc.)
Ces deux sont les deux non-joindre des pièces d'une jointure externe complète. Vous pouvez ensuite afficher ces deux listes d'erreurs dans votre modèle avec colonne appropriée des titres et des codes d'état et tout et tout.
Vous pouvez même les mettre dans une table unique pour imiter les vieux jointure externe complète de rapports pour les gens habitués à voir
Ressemble à une jointure externe complète du rapport. Sans la jointure externe complète.
OriginalL'auteur S.Lott
Colin, l'un des gars avec qui je travaille, écrit un post un certain temps de retour sur personnalisés rejoint dans Django:
http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/
Vous pourriez être en mesure de trouver quelque chose d'utile là-bas!
OriginalL'auteur tobias.mcnulty