2016-02-11 2 views
0

В настоящее время я пытаюсь выполнить команду bulk_create для некоторых объектов в Django 1.9.2 (Python 3.5.1).Проверка данных модели Django на bulk_create

Приложение будет массовым импортированием данных, и я хочу проверить данные, прежде чем вставлять их в БД.

Производительность с использованием .bulk_create(), очевидно, намного превосходит .save(), но .full_clean() также убивает мою работу.

вид на вопрос:

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.')) 

Любые мысли о том, как проверять объекты против типовых правил, не убивая производительность?

В этом случае, я бегу локально (UnitTest), и моя скорость идет от 2.224s вставить 9999 записей без проверки на 19.592s, когда я VALIDATE с помощью .full_clean()

ответ

0

Если вам действительно нужно этот код должен быть выполнен, вы можете вручную создать перенос с RunSQL statement, специфичным для вашей базы данных, где вы можете добавить custom constraint в столбцы базы данных.

Это позволит использовать bulk_create() и возбудит IntegrityError, если он выходит из строя, а не вызывать full_clean() и поймать ValidationError.