9
votes

Django .Filter sur la même option avec plusieurs possibilités

J'ai un modèle d'objets. J'ai également une liste d'options pour filtrer les résultats avec. Je ne sais pas s'il y a un moyen facile de filtrer les objets du modèle tel que n'importe quel objet correspondant à l'un des éléments de la liste de filtres est renvoyé. Par exemple: xxx

existe un moyen de filtrer (dans ce cas) le modèle utilisateur de telle sorte que tout objet correspondant à l'un des éléments de la liste de filtre est renvoyé?


0 commentaires

3 Réponses :


0
votes

deux choix.

  1. Inclure la première lettre en tant que propriété de votre modèle.

  2. Utilisez des requêtes plus avancées.

    Vous pouvez faire ce xxx

    maintenant pouvez-vous filtrer avec le filtre (first_letter__in = ('P', 'T' ))

    Le deuxième choix consiste à créer des objets Django Q pour votre filtre.

    Commencez ici: https://stackoverflow.com/search?q=django+q++ objets


4 commentaires

Vous ne pouvez pas filtrer sur les propriétés Python à l'aide de l'orme Django.


Django ne vous laissera pas utiliser autre chose que le champ (ou l'objet F) dans la recherche.


Je pense que les objets Django Q seraient meilleurs mais j'ai du mal à comprendre comment combiner deux objets Q (et lesquels) afin d'obtenir le résultat approprié. Ce dont j'ai besoin, c'est que tous les objets ayant un champ comme dans une liste. Compte tenu de l'exemple ci-dessus, Patrick, Robert, Thomas, etc. serait des résultats valides. Je ne peux pas sembler comprendre la structure appropriée pour les objets Q pour faire un "startswith aucun de p, t, r"


@ Paradoz870: Stackoverflow.com/questions/4147383/...



36
votes

Ceci peut être fait avec Q Objets

filterList = ['P', 'T', 'R']
query = Q()
for letter in filterList:
    query = query | Q(name__startswith=letter)
usersWithPTRName = User.objects.filter(query)


6 commentaires

Sauf que cela suppose qu'il existe un nombre défini d'éléments que je cherche. La liste de filtre est spécifiquement faite de telle sorte qu'il puisse être de taille variable. J'ai besoin de quelque chose qui ne repose pas sur des objets Q à code Q


@ paradoz870 Voir le deuxième exemple


Merci. Cela a aidé tout à fait moi. J'ai utilisé cela en combinaison avec la suggestion de Ignacio de «réduire ()» ci-dessus.


@catavaran: Cela peut-il être fait à l'aide d'un & ? J'ai essayé sans chance.


FYI: Si vous avez besoin de faire quelque chose comme ceci à l'aide de & Fonctionnalité, consultez Ce


Dans mon expérience, si la liste de filtre est vide, cela retournera tous les utilisateurs, plutôt qu'aucun utilisateur, vous devez donc probablement rechercher cette condition. Je suppose qu'un fichier Q () nouvellement construit est un filtre qui permet à tous les enregistrements, mais dès que vous "ou", il devient un filtre équivalant à la chose que vous ou, ce qui était contre-intuitif tome.



2
votes

Vous pouvez utiliser python réduire et opérateur intégré: xxx


0 commentaires