데이터베이스에 저장할 개체가 많으므로이를 사용하여 Model 인스턴스를 만들고 싶습니다.
django를 사용하면으로 모든 모델 인스턴스를 생성 MyModel(data)
한 다음 모두 저장하고 싶습니다.
현재 다음과 같은 것이 있습니다.
for item in items:
object = MyModel(name=item.name)
object.save()
객체 목록을 직접 저장할 수 있는지 궁금합니다. 예 :
objects = []
for item in items:
objects.append(MyModel(name=item.name))
objects.save_all()
하나의 트랜잭션에 모든 개체를 저장하는 방법은 무엇입니까?
답변
django 개발 당시에 bulk_create
는 클래스 생성자를 사용하여 생성 된 객체 배열을 입력으로받는 객체 관리자 메서드 가 존재합니다 . 장고 문서 확인
답변
사용 bulk_create()
방법. 이제 Django의 표준입니다.
예:
Entry.objects.bulk_create([
Entry(headline="Django 1.0 Released"),
Entry(headline="Django 1.1 Announced"),
Entry(headline="Breaking: Django is awesome")
])
답변
루프 (postgres 9.1)에 대해 수동 트랜잭션 처리를 사용하도록 저를 위해 일했습니다.
from django.db import transaction
with transaction.commit_on_success():
for item in items:
MyModel.objects.create(name=item.name)
실제로 ‘네이티브’데이터베이스 대량 삽입과 동일하지는 않지만 전송 / ORMS 작업 / SQL 쿼리 분석 비용을 피 / 감소시킬 수 있습니다.
답변
다음은 인용 해제 및 이스케이프 해제 루틴을 모두 제외하고 열로 구분 된 파일에서 항목을 대량으로 만드는 방법입니다.
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)
답변
한 줄 구현의 경우지도에서 람다 식을 사용할 수 있습니다.
map(lambda x:MyModel.objects.get_or_create(name=x), items)
여기서 람다는 항목 목록의 각 항목을 x에 일치시키고 필요한 경우 데이터베이스 레코드를 만듭니다.
답변
create를 사용하면 새 항목 당 하나의 쿼리가 발생합니다. INSERT 쿼리의 수를 줄이려면 다른 것을 사용해야합니다.
스 니펫이 꽤 오래되었지만 대량 삽입 스 니펫을 사용하여 약간의 성공을 거두었습니다. 다시 작동하려면 몇 가지 변경이 필요할 수 있습니다.
