Saya memiliki banyak objek untuk disimpan dalam database, jadi saya ingin membuat contoh Model dengan itu.
Dengan django, saya dapat membuat semua contoh model, dengan MyModel(data)
, dan kemudian saya ingin menyimpan semuanya.
Saat ini, saya memiliki sesuatu seperti itu:
for item in items:
object = MyModel(name=item.name)
object.save()
Saya ingin tahu apakah saya dapat menyimpan daftar objek secara langsung, misalnya:
objects = []
for item in items:
objects.append(MyModel(name=item.name))
objects.save_all()
Bagaimana cara menyimpan semua objek dalam satu transaksi?
django
django-models
Alexis Métaireau
sumber
sumber
Jawaban:
pada pengembangan django, ada
bulk_create
sebagai metode manajer objek yang mengambil sebagai masukan larik objek yang dibuat menggunakan konstruktor kelas. lihat dokumen djangosumber
bulk_create
: docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-createIf the model’s primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does, unless the database backend supports it (currently only PostgreSQL).
bulk_create()
tidak memicu sinyal apapun. Kenapa ya.Gunakan
bulk_create()
metode. Ini standar di Django sekarang.Contoh:
Entry.objects.bulk_create([ Entry(headline="Django 1.0 Released"), Entry(headline="Django 1.1 Announced"), Entry(headline="Breaking: Django is awesome") ])
sumber
bekerja bagi saya untuk menggunakan penanganan transaksi manual untuk loop (postgres 9.1):
from django.db import transaction with transaction.commit_on_success(): for item in items: MyModel.objects.create(name=item.name)
sebenarnya ini tidak sama, seperti penyisipan massal database 'asli', tetapi memungkinkan Anda untuk menghindari / menurunkan transportasi / operasi orms / biaya analisis kueri sql
sumber
commit_on_success
lagi. Anda harus menggunakantransaction.atomic()
See: stackoverflow.com/questions/21861207/…Berikut adalah cara membuat entitas secara massal dari file yang dipisahkan kolom, mengesampingkan semua rutinitas unquoting dan un-escape:
SomeModel(Model): @classmethod def from_file(model, file_obj, headers, delimiter): model.objects.bulk_create([ model(**dict(zip(headers, line.split(delimiter)))) for line in file_obj], batch_size=None)
sumber
untuk implementasi baris tunggal, Anda bisa menggunakan ekspresi lambda di peta
map(lambda x:MyModel.objects.get_or_create(name=x), items)
Di sini, lambda mencocokkan setiap item dalam daftar item dengan x dan membuat rekaman Database jika perlu.
Dokumentasi Lambda
sumber
lambda
harusmap
ped lebihitems
:map(lambda name: MyModel.objects.get_or_create(name = name), items)
Menggunakan create akan menyebabkan satu kueri per item baru. Jika Anda ingin mengurangi jumlah query INSERT, Anda harus menggunakan yang lain.
Saya telah cukup berhasil menggunakan cuplikan Penyisipan Massal, meskipun cuplikan tersebut cukup lama. Mungkin ada beberapa perubahan yang diperlukan untuk membuatnya berfungsi kembali.
http://djangosnippets.org/snippets/446/
sumber
Lihat posting blog ini pada modul bulkops .
Pada aplikasi django 1.3 saya, saya mengalami percepatan yang signifikan.
sumber
Cara termudah adalah dengan menggunakan
create
metode Manajer, yang membuat dan menyimpan objek dalam satu langkah.for item in items: MyModel.objects.create(name=item.name)
sumber
name
input unik dan duplikat dimungkinkan maka akan menjadi ide yang baik untuk digunakanget_or_create
.