Considérez les modèles:Django - queryset couvrant les relations nulles utilisant Q
#Models
class A(models.Model):
fieldOfA = models.CharField(max_length = 4)
class B(models.Model):
fieldOfB = models.CharField(max_length = 4)
class C(models.Model):
classA = models.ForeignKey(A, blank=True, null=True)
classB = models.ForeignKey(B, blank=True, null=True)
Quand je crée des objets de C, je me assurer qu'un objet a soit une relation CLASSA ou ClassB. Je recherche un simple jeu de requête, qui me donne des objets de C pour des valeurs fieldOfA spécifiques ou fieldOfB spécifiques.
J'ai essayé ceci, mais cela échoue (renvoie [], malgré des résultats valides).
#Views - assume double underscore in the query
from django.db.models import Q
my_query = C.objects.filter(Q(classA _ _isnull = False, classA _ _fieldOfA = 'foo') | Q(classB _ _isnull = False, classB _ _fieldOfB = 'foo'))
Le problème que je vois est le '|' c'est l'appliqué. Deux différents querysets pour classA et classB fonctionnent bien. D'une manière ou d'une autre, je pourrais appliquer un simple jeu de requête pour que cela fonctionne? Ou pire, un moyen de fusionner les querysets individuels.
Malheureusement, l'élimination de la redondance n'a pas aidé. Le SQL a deux 'JOINT OUTER OUTER' pour les deux Q (suivi intérieurement par un INNER JOIN). Le deuxième Q ne devrait-il pas avoir un DROIT EXTERNE? Les valeurs fieldB ne sont pas restaurées. Merci pour l'aide cependant. Je chaînais (fusionnant, d'une certaine manière) les deux querysets maintenant, ce qui fonctionne aussi pour moi. En utilisant cet extrait de code - http://www.djangosnippets.org/snippets/1103/ – tjazz