2012-02-15 1 views
0

Comment puis-je améliorer ce bloc de code?Une meilleure façon de créer plusieurs objets en une fois dans Django

Dois-je tout mettre dans la méthode de sauvegarde? Utilisez plusieurs blocs try..except? En outre, comment puis-je annuler la transaction entière de sorte que si elle échoue à l'une des étapes de création, le reste des objets précédemment créés est annulé.

@login_required 
def admin_import_residents_confirm(request, comp_slug, file_id): 
    comp = get_object_or_404(Comp, slug=comp_slug) 
    file = get_object_or_404(ResidentImportFile, id=file_id) 
    resident_list = ResidentImportData.objects.filter(comp=comp, 
      file=file) 

    if request.method == 'POST': 
     for resident in resident_list: 
      try: 
       # create the user objects here 
       pw = User.objects.make_random_password(length=6, 
         allowed_chars='1234567890') 
       fusername = '{0}{1}{2}'.format(resident.first_name, 
          resident.last_name, 
          re.sub('\D', '', resident.unit_number)) 
       user = User.objects.create(
         username = fusername, 
         password = pw, 
         first_name = resident.first_name, 
         last_name = resident.last_name) 

       # second create the profile objects 
       Profile.objects.create(user=user, 
         contact_number=resident.contact_number) 

       # third create the role objects 
       role = Role.objects.filter(comp=comp, 
         name=2)[0] 
       role.user.add(user) 

       # fourth create the usercomp object 
       Usercomp.objects.create(
         user=user, 
         comp=comp, 
         unit_number=resident.unit_number, 
         block_number=resident.block_number) 

       # fifth store the one time passwords 
       TempPasswords.objects.create(
         user=user, 
         password=pw) 

       # sixth update created status 
       resident.is_created = True 
       resident.save() 

      except Exception, e: 
       print e 
       url = reverse('admin_import_residents_confirm', 
         args=[comp.slug, file.id ]) 
       return redirect(url) 

     url = reverse('admin_resident_list', args=[comp.slug]) 
     return redirect(url) 
+0

Vous obtiendrez une exception sur la troisième ligne. – DrTyrsa

+0

Quels problèmes avez-vous avec le code? Pourquoi un échouerait-il? A-t-il échoué avant? –

Répondre

0

Vous utilisez signals pour créer tous les autres objets lorsque l'utilisateur initial a été créé. De cette façon, vous pouvez diviser les morceaux en différentes méthodes/receveurs de signaux (un pour le profil, un pour le mot de passe temporaire, etc.) qui seront tous appelés lors de la création de l'utilisateur initial. En ce qui concerne une transaction - vous pouvez conserver les nouveaux objets dans la base de données jusqu'à ce qu'ils soient tous créés, ce qui signifie que si vous sortez de l'essai/catch sans exception, vous savez que tous les objets sont créés et par conséquent les sauver. Cela devient plus difficile si vous cassez la méthode unique dans des récepteurs de signaux plus petits.

Questions connexes