Вы хотите проверить django.db.transaction.commit_manually
.
http://docs.djangoproject.com/en/dev/topics/db/transactions/#django-db-transaction-commit-manually
Так было бы что-то вроде:
from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
...
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
transaction.commit()
Который будет фиксироваться только один раз, вместо этого при каждом сохранении ().
В django 1.3 были введены менеджеры контекста.
Теперь вы можете использовать action.commit_on_success () аналогичным образом:
from django.db import transaction
def viewfunc(request):
...
with transaction.commit_on_success():
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
В django 1.4 было добавлено bulk_create
, позволяющее создавать списки объектов модели и затем фиксировать их все сразу.
ПРИМЕЧАНИЕ метод сохранения не будет вызываться при использовании массового создания.
>>> Entry.objects.bulk_create([
... Entry(headline="Django 1.0 Released"),
... Entry(headline="Django 1.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
В django 1.6 была введена транзакция.atomic , предназначенная для замены устаревших функций commit_on_success
и commit_manually
.
из документации django по атомарным :
atomic можно использовать как декоратор:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
и в качестве менеджера контекста:
from django.db import transaction
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic():
# This code executes inside a transaction.
do_more_stuff()