En exemple. Si j'ai un modèle Personne qui a un champ Mère, qui est une clé étrangère Ce qui suit m'interpelle :
p = Person.object.get(id=1)
if p.mother_id:
print "I have a mother!"
Dans l'exemple ci-dessus, nous avons émis une requête. J'ai fait en sorte que Django ne récupère pas la mère en utilisant le champ _id au lieu de mother.id. Mais si je devais filtrer sur tous ceux qui n'ont pas de mère :
Person.objects.filter(mother=None)
Person.objects.filter(mother__id=None)
Person.objects.filter(mother__isnull=True)
Person.objects.filter(mother__id__isnull=True)
Toutes ces jointures sont inutiles dans la table liée et je ne peux pas référencer les colonnes _id, car ce ne sont pas des champs donc l'une ou l'autre des propositions suivantes échoue :
Person.objects.filter(mother_id__isnull=True)
Person.objects.filter(mother_id=None)
Existe-t-il un moyen pour moi de construire un querySet qui vérifie l'existence d'une valeur dans la colonne de la clé étrangère sans subir la jointure ?
Merci d'avance.
Edit (répondu) : Le mérite revient à Bernd, qui a commenté la réponse de Daniel, mais il s'avère que cette solution de contournement fonctionne parfaitement pour renvoyer les personnes sans mère, sans émettre de jointure inutile :
Person.objects.exclude(mother__isnull=False)
Modifier (plus de détails) :
Je dois également mentionner que j'ai constaté que ce comportement ne semble se manifester que lorsque la relation FK est annulable. Bizarre, mais vrai.