2016-02-11 1 views
0

Je tente actuellement de créer en bloc des objets dans Django 1.9.2 (Python 3.5.1).Validation des données du modèle Django sur bulk_create

L'application importera en bloc des données et je souhaite valider les données avant de les insérer dans la base de données.

Les performances avec .bulk_create() sont, de toute évidence, très supérieures à .save(), mais .full_clean() est également en train de tuer mes performances.

vue en question:

subscription = get_object_or_404(Subscription, pk=subscription_id) 
users = list(range(1,10000)) 
if users: 
    licenses = [] 
    for u in users: 
     license = SubscriptionLicense(resource=subscription.resource, 
      external_user_id=int(u), license_expiration_time=None, 
      transferable=subscription.license_transferable, 
      subscription=subscription 
     ) 

     # Question is in regards to this line 
     license.full_clean() 

     licenses.append(license) 
    SubscriptionLicense.objects.bulk_create(licenses) 
    return HttpResponse(status=201) 
else: 
    raise ValidationError(_('Invalid users provided.')) 

Toute réflexion sur la façon de valider les objets contre les règles du modèle sans tuer la performance?

Dans ce cas, je suis en cours d'exécution localement (unittest) et ma vitesse va de 2.224s pour insérer des enregistrements 9999 sans validation 19.592s quand je VALIDER en utilisant .full_clean()

Répondre

0

Si vous avez vraiment besoin ce code pour être performant, vous pouvez créer manuellement une migration avec un RunSQL statement spécifique à votre back-end de base de données, où vous pouvez ajouter un custom constraint à vos colonnes de base de données.

C'est vous permettra d'utiliser bulk_create() et soulèvera une IntegrityError si elle échoue, plutôt que d'appeler full_clean() et attraper le ValidationError.