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)
Vous obtiendrez une exception sur la troisième ligne. – DrTyrsa
Quels problèmes avez-vous avec le code? Pourquoi un échouerait-il? A-t-il échoué avant? –