如何使用Django对象处理异常.bulk_create()

时间:2016-04-17 08:51:15

标签: python django django-models django-orm

我正在使用bulk_create来创建模型的对象。每当引发异常时,我该如何处理它?<​​/ p>

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

Student.objects.bulk_create(aList)

由于模型的字段name unique=True ,因此我必须在引发异常时处理输入。我如何逐个处理异常。

这不按预期工作,

try:
    # bulk_create
except:
    # handlers

引发异常时,bulk_create进程终止。

PS。我期待 bulk_create 没有createupdate_or_createget_or_create

的循环

2 个答案:

答案 0 :(得分:0)

嗯,这是不可能的。这就是$(function() { var tabs = $( "#tabs" ) tabs.tabs({ activate: function(e,ui) { var index = ui.newTab.index() location.hash = index; }, active: location.hash.replace(/#/,"") || 0 }); }); 的定义方式:

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循环。

还有一件事。也只能在事务块中保存一些条目。它要么完全执行要么根本不执行。

答案 1 :(得分:0)

实际上有一个标记ignore_conflicts=False,它捕获异常,因此尝试ModelName([name='spam', slug='eggs',..], ignore_conflicts=True)

是有意义的