web-dev-qa-db-fra.com

django modèle if ou instruction

Fondamentalement, pour rendre cela simple et rapide, je cherche à exécuter un XOR conditionnel dans Django modèle. Avant de demander pourquoi je ne le fais pas simplement dans le code, ce n'est pas une option.

Fondamentalement, je dois vérifier si un utilisateur se trouve dans l'un des deux objets plusieurs-à-plusieurs.

req.accepted.all 

et

req.declined.all

Maintenant, ils ne peuvent être que dans l'un ou l'autre (d'où le XOR conditionnel). En regardant autour des documents, la seule chose que je peux comprendre est la suivante

{% if user.username in req.accepted.all or req.declined.all %}

Le problème que j'ai ici est que si user.username apparaît en effet dans req.accepted.all alors il échappe au conditionnel mais s'il est dans req.declined.all alors il suivra la clause conditionnelle.

Est-ce que j'ai râté quelque chose?

26
Neil Hickman

and a une priorité plus élevée que or, vous pouvez donc simplement écrire la version décomposée:

{% if user.username in req.accepted.all and user.username not in req.declined.all or
      user.username not in req.accepted.all and user.username in req.declined.all %}

Pour plus d'efficacité, utilisez with pour ignorer la réévaluation des ensembles de requêtes:

{% with accepted=req.accepted.all declined=req.declined.all username=user.username %}
    {% if username in accepted and username not in declined or
          username not in accepted and username in declined %}
    ...
{% endif %}
{% endwith %}
34
Peter DeGlopper

Réponse reformulée de la réponse acceptée:

Obtenir:

{% if A xor B %}

Faire:

{% if A and not B or B and not A %}

Ça marche!

9
db0