我目前正在尝试在Django 1.9.2(Python 3.5.1)中批量创建一些对象。
应用程序将批量导入数据,我想在将数据插入数据库之前验证数据。
使用.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),当我使用.full_clean()
进行验证时,我的速度从2.224秒到未经验证的9999条记录插入19.592s答案 0 :(得分:0)
如果您确实需要此代码具有高性能,则可以手动创建一个特定于数据库后端RunSQL
statement的迁移,您可以在其中向数据库列添加custom constraint。
这将允许您使用bulk_create()
,如果失败则会引发IntegrityError
,而不是致电full_clean()
并抓住ValidationError
。