在bulk_create上验证Django模型数据

时间:2016-02-11 05:42:28

标签: python django performance validation bulkinsert

我目前正在尝试在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

1 个答案:

答案 0 :(得分:0)

如果您确实需要此代码具有高性能,则可以手动创建一个特定于数据库后端RunSQL statement的迁移,您可以在其中向数据库列添加custom constraint

这将允许您使用bulk_create(),如果失败则会引发IntegrityError,而不是致电full_clean()并抓住ValidationError