【问题标题】:Validating Django model data on bulk_create在 bulk_create 上验证 Django 模型数据
【发布时间】:2016-05-21 18:36:22
【问题描述】:

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

【问题讨论】:

    标签: python django performance validation bulkinsert


    【解决方案1】:

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

    这将允许您使用 bulk_create() 并在失败时引发 IntegrityError,而不是调用 full_clean() 并捕获 ValidationError

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2017-08-16
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多