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?
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 %}
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!