如何处理Django对象的异常。bulk_create()

所有的Vaiіtы

bulk_create用来创建模型的对象。每当引发异常时,我该如何处理?

aList = [
    Student(name="Jason"),
    Student(name="Mark"),
    Student(name="Tom"),
    Student(name="Jason"),
    Student(name="Tom"),
]

Student.objects.bulk_create(aList)

由于模型的字段nameunique=True,因此在出现异常时,我必须处理输入。我如何一一处理异常。

这不符合预期,

try:
    # bulk_create
except:
    # handlers

当引发异常时,该bulk_create过程终止。

PS。我期待着bulk_create没有循环createupdate_or_createget_or_create

索波列文

好吧,那是不可能的。那怎么bulk_create定义:

def bulk_create(self, objs, batch_size=None):
        for parent in self.model._meta.get_parent_list():
            if parent._meta.concrete_model is not self.model._meta.concrete_model:
                raise ValueError("Can't bulk create a multi-table inherited model")
        if not objs:
            return objs
        self._for_write = True
        connection = connections[self.db]
        fields = self.model._meta.concrete_fields
        objs = list(objs)
        self._populate_pk_values(objs)
        with transaction.atomic(using=self.db, savepoint=False):
            if (connection.features.can_combine_inserts_with_and_without_auto_increment_pk
                    and self.model._meta.has_auto_field):
                self._batched_insert(objs, fields, batch_size)
            else:
                objs_with_pk, objs_without_pk = partition(lambda o: o.pk is None, objs)
                if objs_with_pk:
                    self._batched_insert(objs_with_pk, fields, batch_size)
                if objs_without_pk:
                    fields = [f for f in fields if not isinstance(f, AutoField)]
                    self._batched_insert(objs_without_pk, fields, batch_size)

        return objs

_batched_insert

def _batched_insert(self, objs, fields, batch_size):
    """
    A little helper method for bulk_insert to insert the bulk one batch
    at a time. Inserts recursively a batch from the front of the bulk and
    then _batched_insert() the remaining objects again.
    """
    if not objs:
        return
    ops = connections[self.db].ops
    batch_size = (batch_size or max(ops.bulk_batch_size(fields, objs), 1))
    for batch in [objs[i:i + batch_size]
                  for i in range(0, len(objs), batch_size)]:
        self.model._base_manager._insert(batch, fields=fields,
                                         using=self.db)

因此,如您所见bulk_create,基本上是for内的循环transaction.atomic

还有一件事。在事务块内仅保存一些条目也是不可能的。它要么完全执行,要么根本不执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django`bulk_create`与相关对象

来自分类Dev

django bulk_create 是否可能出现异常

来自分类Dev

使用 django bulk_create() 返回 none 的对象实例

来自分类Dev

Django覆盖bulk_create

来自分类Dev

django的bulk_create是原子的吗?

来自分类Dev

如何处理 Django 1.8.7 中的异常

来自分类Dev

Django在执行bulk_create时设置many_to_many对象

来自分类Dev

使用Django bulk_create()函数时,'dict'对象没有属性'pk'

来自分类Dev

使用 Django 的 bulk_create() 方法时出错

来自分类Dev

Django bulk_create检查多个字段的重复条目

来自分类Dev

django-pyodbc bulk_create已损坏

来自分类Dev

Django的ManyToMany字段的bulk_create的正确方法?

来自分类Dev

具有 Null 值的 django bulk_create

来自分类Dev

在django bulk_create中获取IntegrityError的密钥

来自分类Dev

Django bulk_create ignore_conflicts =真正泄漏内存

来自分类Dev

Django ORM bulk_create 1:1 相关模型

来自分类Dev

Django bulk_create with ignore_conflicts = True给定ProgrammingError

来自分类Dev

在bulk_create上插入由django ORM创建的语句

来自分类Java

如何处理实例化类对象时发生的异常

来自分类Dev

为什么在Django上使用bulk_create通过外键插入数据会返回“属性对象不可调用”?

来自分类Dev

如何处理django多数据库中的异常

来自分类Python

如何处理异常并退出?

来自分类Java

parallelStream如何处理异常?

来自分类Dev

如何处理InvalidSchema异常

来自分类Dev

EJB如何处理异常?

来自分类Dev

如何处理ContentProvider的异常?

来自分类Dev

如何处理FirebaseAuth异常

来自分类Dev

如何处理 HttpAsyncClient 异常

来自分类Dev

如何处理登录异常?