mik*_*kec 65 django django-models django-queryset django-views
有没有办法使用django 1.4+中的bulk_create功能获取您创建的项目的主键?
Or *_*uan 55
从Django 1.10开始 - 它现在支持(仅在Postgres上),这里是doc的链接.
>>> list_of_objects = Entry.objects.bulk_create([
... Entry(headline="Django 2.0 Released"),
... Entry(headline="Django 2.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
>>> list_of_objects[0].id
1
Run Code Online (Sandbox Code Playgroud)
从更改日志中:
更改了Django 1.10:添加了在使用PostgreSQL时使用bulk_create()创建的对象上设置主键的支持
pyr*_*iku 28
根据文档,你不能这样做:https://docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-create
bulk-create就是为了这个:以有效的方式创建大量对象,从而节省了大量的查询.但这意味着你得到的反应有点不完整.如果你这样做:
>>> categories = Category.objects.bulk_create([
Category(titel="Python", user=user),
Category(titel="Django", user=user),
Category(titel="HTML5", user=user),
])
>>> [x.pk for x in categories]
[None, None, None]
Run Code Online (Sandbox Code Playgroud)
这并不意味着您的类别没有pk,只是查询没有检索它们(如果键是一个AutoField).如果由于某种原因需要pks,则需要以经典方式保存对象.
kar*_*ikr 24
我能想到的两种方法:
a)你可以做到
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)
Run Code Online (Sandbox Code Playgroud)
如果查询集非常庞大,这可能会有点贵.
b)如果模型有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)
Run Code Online (Sandbox Code Playgroud)
这具有存储在创建对象时存储的字段的限制.
Dan*_*anH 11
实际上我的同事提出了以下解决方案,现在看来这一切都很明显.添加一个新列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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23393 次 |
| 最近记录: |