comment faire pour vérifier si l'objet existe dans manytomany
Modèles
class Beer(models.Model):
pass
class Salas(models.Model):
name = models.CharField(max_length=20)
beers = models.ManyToManyField('Beer', blank=True)
Vue
beer = Beer.objects.get(user=user)
id_sala = request.GET['id_sala']
sala = get_object_or_404(Salas, id=id_sala)
if beer.salas_set.filter(nombre=sala):
# if beer.objects.filter(sitios__id=beer).exists():
sala.beers.remove(beer)
else:
sala.beers.add(beer)
Je veux voir si il y a relation de bière avec sala, comment faire cela??
Vous devez vous connecter pour publier un commentaire.
Avec votre solution, il pourrait être un problème puisque le nom de salas n'est pas unique. Donc, si vous filtrez par le nom de la salle en attendant de trouver un et un seul sala, qui peut ne pas se produire.
Je vous conseille de faire:
de cette façon,
beer.salas_set.all()
sera de retour un QuerySet dans lequel vous pouvez vérifier si un objet est là, avec en mot-clé.in
opérateur est pris en charge, maisexists()
est selon les Docs plus rapide.exists()
par lui-même vérifie si le queryset a des résultats, ce n'est pas la même chose que ce que Patrick est en train de faire. Si vous savez comment la requête de l'objet particulier, vous pouvez le faire:if beer.salas_set.filter(pk=sala.pk).exists():
et qui serait plus rapide, sauf si vous avez chargé lesalas_set
avecprefetch_related('salas_set')
avant (Voir Jakub réponse)Je vous conseille d'utiliser:
Si vous utilisez
sala in beer.salas_set.all()
au lieu de cela, il sélectionne tous les enregistrements de la table de relation et de boucles, pour le trouver, si l'objet donné est là ou pas. Cependant,beer.salas_set.filter(pk=sala.pk).exists()
ne sélectionne que zéro ou une ligne de la base de données et donne immédiatement le résultat (sans boucle).in
opérateur de QuerySet devrait être aussi efficace, et beaucoup plus pythonic !! (c'est à dire moins de parenthèse ; mais je ne pouvais pas trouver la bonne référence dans les docs...)in
force de django pour évaluer le queryset de résultat dans un booléen. C'est, querysets sont paresseusement-évalué, si c'est un 10000-objet queryset, ça va être assez lent. D'autre part,.filter().exists()
va faire une requête supplémentaire dans la base de données, mais ça va être juste une.