Django ForeignKey avec null=True, jointure interne, et d'une jointure externe gauche
Disons que j'ai deux modèles Django Personne et la Société, comme suit: -
class Company(models.Model):
name = models.CharField()
class Person(models.Model):
last_name = models.CharField(blank=True)
first_name = models.CharField()
company = models.ForeignKey(Company, null=True, blank=True)
Une Personne peut ou peut ne pas appartenir à une Société.
Je suis de l'utilisation de MySQL. Je veux que toutes les Personnes qui n'appartiennent pas à une Société, qui est, les Personnes où l'entreprise est nul.
Si je ne Person.objects.filter(company__isnull=True)
- je obtenir un SQL qui est essentiellement: -
SELECT * FROM PersonTable LEFT OUTER JOIN AgencyTable ON (PersonTable.company_id = AgencyTable.id) WHERE AgencyTable.id IS NULL
Comment puis-je atteindre le SQL suivant: -
SELECT * FROM PersonTable INNER JOIN AgencyTable ON (PersonTable.company_id = AgencyTable.id) WHERE AgencyTable.id IS NULL
De ce que je comprends à la lecture de l'Django liste de diffusion des Utilisateurs, c'est le comportement avant de QuerySet Refactoriser.
EDIT -- je vois Maintenant que le blasphème de ma question!
Ce que je veux dire c'est que je veux simplement faire
SELECT * FROM PersonTable WHERE PersonTable.company_id IS NULL
Cette question est vraiment le résultat d'un blocage mental.
OriginalL'auteur chefsmart | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
Bien, cette question est ancienne, et bientôt le patch sera dans Django. Mais pour le bref intervalle de temps, la réponse est dans http://code.djangoproject.com/ticket/10790:
OriginalL'auteur Jameson Quinn
Il devrait être aussi simple que:
Notez l'utilisation de
company_id
qui est la valeur par défaut entier champ créé par le ForeignKeyModifier
Désolé, je n'ai pas utilisé activement django depuis 0.9.5. Soit je suis la pensée de pré-1.0 comportement, ou je suis embrouiller jusqu'sqlalchemy et de l'ORM de Django. Dans les deux cas, les commentaires indiqué, ci-dessus semble ne pas fonctionner.
Il semble que la seule façon d'obtenir de la requête que vous souhaitez dans le courant de django est d'utiliser le
.extra
paramètre de requête, qui est livré avec toute une liste de mises en garde.Noter que cela peut ne pas être transférables à l'ensemble de la DB, et elle peut ne pas être combiné avec le filtre(), et un certain nombre de problèmes possibles. Je recommande de ne pas utiliser cette tout au long de votre code, et au lieu de le déplacer vers un classmethod sur la Personne comme:
Alternativement, il suffit d'utiliser le bon ORM syntaxe de la requête et le sucer jusqu'à la possible de performances (avez-vous réellement comparé la plus compliquée de la requête pour voir que c'est encore plus lentement?)
Hrm. J'ai pensé qu'il était possible de s'interroger sur la touche comme ça. Je suppose que c'est le retour à la planche à dessin.
Ce n'est pas possible.
company__id__isnull
serait valable, mais permettrait de générer à peu près la même SQL.Crast faisait référence à company_id (seul trait de soulignement). Je pense que vous faites référence à la société__id (double trait)
C'est correct. J'ai voulu montrer que la façon dont
company_id
est référencé dans un QuerySet méthode n'est pas ne va pas au travail, mais aussi donner une erreur.OriginalL'auteur Crast
Django va traiter
NULL
comme PythonNone
objet:OriginalL'auteur Zach