2017-04-19 2 views
0

J'ai un modèle que je souhaite filtrer par son attribut a. Le modèle a également un autre attribut b. J'essaie de filtrer les entrées où a est 0 ou a a la valeur de l'attribut b (pour chaque ligne, évidemment). Comment puis-je filtrer par la valeur d'une autre colonne?Django QuerySet: filtre par la valeur d'un autre champ

Voici ce que j'ai essayé, et la pièce manquante:

MyModel.objects.filter(Q(a=0) | Q(a=???)) # ??? is to be the value of the `b` column 

J'utilise Django 1.4 et je sais qu'il est une ancienne version qui est plus soutenu, mais l'exécution malheureusement, la mise à niveau n'est pas à moi.

+0

Avez-vous la possibilité de changer de modèle? –

+0

F expression est disponible en 1.4, c'est exactement ce que vous cherchez. –

Répondre

2

Je pense que vous pouvez utiliser un F expression avec votre objet Q:

MyModel.objects.filter(Q(a=0) | Q(a=F('b'))) 

Je vous suggère également planifiez votre mise à jour maintenant, sinon, vous manquerez d'autres fonctionnalités et correctifs de sécurité.

+0

hein, pour une raison quelconque, j'ai pensé que les expressions 'F' ont été introduites plus récemment. Je vous remercie. Comme je l'ai mentionné, ce n'est absolument pas à moi de mettre à niveau, j'aurais aimé qu'il le soit. – dabadaba

1

Vous pouvez utiliser le modèle F pour comparer deux champs.

from django.db.models import F 
MyModel.objects.filter(a__exact = F('b')) 

Donc, pour votre requête commune, vous pouvez utiliser quelque chose comme,

MyModel.objects.filter(Q(a=0) | Q(a__exact=F('b'))) 
+0

Est-ce que cela vérifie si les deux valeurs sont les mêmes? –

+0

Oh, vous vouliez dire une valeur a égale à l'attribut b, désolé, il n'était pas clair à partir de votre question, laissez-moi voir ce que je peux faire. – Osiris92

+0

Lisez la question attentivement avant de répondre. – Iqbal