Question Django: vérifie si un objet existe déjà avant d'ajouter


C'est une question assez simple sur Django, mais je ne trouve pas la réponse dans les docs de Django, malgré beaucoup de chasse!

Comment puis-je vérifier si un objet existe déjà, et l'ajouter uniquement s'il le fait ne pas existe déjà?

Voici le code - Je ne veux pas ajouter la trace_role deux fois dans la base de données si elle existe déjà. Comment puis-je vérifier en premier? Utilisez peut-être get () - mais Django se plaindra-t-il si get () ne renvoie rien?

current_user = request.user
follow_role = UserToUserRole(from_user=current_user, to_user=user, role='follow')
follow_role.save()

Merci!


25
2017-11-30 17:26


origine


Réponses:


Il y a une fonction d'assistance pour cet idiome appelée 'get_or_create' sur votre gestionnaire de modèles:

role, created = UserToUserRole.objects.get_or_create(
    from_user=current_user, to_user=user, role='follow')

Il retourne un tuple de (model, bool) où "model" est l'objet qui vous intéresse et "bool" vous indique s'il doit être créé ou non.


36
2017-11-30 17:39



Si vous utilisez une version récente de Django, vous pouvez utiliser le unique_together option au modèle UserToUserRole, puis utilisez la méthode get_or_create () affichée par Joe Holloway. Cela garantira que vous ne pouvez pas obtenir un duplicata.


4
2017-11-30 17:42



Si vous recherchez une valeur bool

UserToUserRole.objects.filter(
    from_user=current_user, to_user=user, role='follow'
).exists()

1
2018-05-14 07:47



Si vous souhaitez que le contrôle soit effectué à chaque fois avant d’enregistrer, vous pouvez utiliser le signal de pré-enregistrement pour vérifier, http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save

Dans le modèle, vous pouvez également spécifier unique = True pour la propriété qui détermine si un élément est le même élément, ce qui entraînera la levée d'une exception (django.db.IntegrityError) si vous essayez d'enregistrer à nouveau la même chose.

Si vous avez plusieurs champs ensemble qui rendent quelque chose d'unique, vous devrez utiliser unique_together dans la classe interne Meta http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together


0
2017-11-30 17:43



Vous pouvez utiliser get (), mais vous devrez l’emballer avec try-excepté comme ceci:

try:
    obj = UserToUserRole.objects.get(from_user=current_user, to_user=user, role='follow')
except UserToUserRole.DoesNotExist:
    # here write a code to create a new object

0
2018-04-28 05:40