Django中的QuerySet有bulk_create方法,但是此方法不会如预期的一样返回新增的所有对象的id,这个特性相当令人头疼,不过Postgre SQL在Django1.10后已经可以返回id了,MySQL还是不行
所以 我们只能自己实现返回的ids
一,
category_ids = Category.objects.values_list('id', flat=True)
categories = Category.objects.bulk_create([
Category(title="title1", user=user, created_at=now),
Category(title="title2", user=user, created_at=now),
Category(title="title3", user=user, created_at=now),
])
new_categories_ids = Category.objects.exclude(id__in=category_ids).values_list('id', flat=True)
如果查询集非常庞大,这可能会有点耗时。
二,
如果模型有一个created_at字段
now = datetime.datetime.now()
categories = Category.objects.bulk_create([
Category(title="title1", user=user, created_at=now),
Category(title="title2", user=user, created_at=now),
Category(title="title3", user=user, created_at=now),
])
new_cats = Category.objects.filter(created_at >= now).values_list('id', flat=True)
三,
添加一个名为bulk_ref的新列,您将在其中填充一个唯一值并为每一行插入。然后,只需简单地查询事先设置了bulk_ref的表,就可以检索您插入的记录。
cars = [Car(
model="Ford",
color="Blue",
price="5000",
bulk_ref=5,
),Car(
model="Honda",
color="Silver",
price="6000",
bulk_ref=5,
)]
Car.objects.bulk_create(cars)
qs = Car.objects.filter(bulk_ref=5)