Django à l'exclusion des instances spécifiques de queryset sans l'aide du champ de recherche
J'ai parfois le besoin de s'assurer certains cas, sont exclus d'un queryset.
C'est la façon dont je le fais habituellement:
unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
uninteresting_stuff_happens()
my_results = MyModel.objects.exclude(id=unwanted_instance.id)
ou, si j'ai plus d'entre eux:
my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])
Cela "sent" un peu maladroit, j'ai donc essayé:
my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)
Qui ne fonctionne pas. Mais j'ai lu ici DONC qu'une sous-requête peut être utilisé en tant que paramètre pour exclure.
Suis-je de la chance? Suis-je manque certaines fonctionnalités (vérifié les docs, mais n'ai pas trouvé utile de pointeur)
Vous devez vous connecter pour publier un commentaire.
La façon dont vous vous êtes déjà fait il s'agit de la meilleure façon.
Si c'est un modèle indépendant façon de faire ce que vous cherchez, n'oubliez pas que vous pouvez faire
query.exclude(pk=instance.pk)
.Seulement comme une parenthèse, si l'ORM de Django avait une identité mappeur (il n'est pas à l'heure actuelle), alors vous seriez en mesure de faire quelque chose comme
MyModel.objects.filter(<query>).all().remove(<instance>)
, mais vous êtes hors de la chance à cet égard. La façon dont vous le faites (ou l'un au-dessus) est le meilleur que vous avez.Oh, et aussi, vous pouvez faire beaucoup mieux que ce que
in
requête avec une compréhension de liste:query.exclude(id__in=[o.id for o in <unwanted objects>])
MyModel.objects.filter(<exclude-query>)
), vous pouvez obtenir les id à l'aide d'unValuesQuerySet
comme suit:id_dicts = MyModel.objects.filter(<exclude-query>).values('id')
et puisquery.exclude(id__in=[item['id'] for item in id_dicts])
.values_list( "id", flat = True )
pour obtenir une liste séquentielle de tous les codes. Ce sera toutefois frappé par la DB, donc, je vous suggère d'utiliser Python compréhension de liste.La réponse qui est Donnée est parfait et essayez ce qui fonctionne très bien pour moi
étape 1)
étape 2)
Q
expression de mieux que de.exclude(id__in=[o.id for o in <unwanted objects>])
?blocks = self.blocks.filter(~Q(image='') | Q(~Q(video='') & Q(loop=True)))
Vous pouvez mettre vos articles non désirés dans la liste , et une extraction de tous les éléments, sauf ceux de la liste comme suit: