2012-02-15 8 views
0

このコードブロックを改善するにはどうすればよいですか?Djangoで複数のオブジェクトを作成するより良い方法

すべてを保存する必要がありますか?複数のtry..exceptブロックを使用しますか?また、「作成」段階のいずれかで失敗した場合、以前に作成された残りのオブジェクトがロールバックされるように、トランザクション全体をロールバックする方法もあります。

@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

3行目で例外が発生します。 – DrTyrsa

+0

コードにどのような問題がありますか?なぜ誰かが失敗するでしょうか?それは以前に失敗しましたか? –

答えて

0

signalsを使用して、初期ユーザーが作成された後は他のすべてのオブジェクトを作成します。こうすることで、チャンクを独立したメソッド/シグナルレシーバ(プロファイル用のもの、一時パスワード用のものなど)に分割することができます。これらはすべて、初期ユーザーの作成時に呼び出されます。

トランザクションに関しては、新しいオブジェクトがすべて作成されるまで、新しいオブジェクトをDBにコミットするのを延期することができます。つまり、例外なくtry/catchから抜け出すと、すべてのオブジェクトが作成され、したがってそれらを救いなさい。単一のメソッドをより小さなシグナルレシーバーに分割すると、これはより困難になります。

関連する問題