본문 바로가기
개발/Django

[Django] model object를 clone, copy 하는 법

by JeonJaewon 2021. 2. 14.

이미 생성된 object들을 동일하게 복사해 생성시켜야 할 때가 있습니다.

Django 공식 문서를 참고해서 해결 해 보겠습니다.


가장 기본적인 방법은, 해당 object의 pk를 None으로 설정하는 방법입니다.

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1

blog.pk = None
blog.save() # blog.pk == 2

해당 pk가 None으로 설정된 instance는 DB에 새로운 레코드로 생성되며, pk를 제외한 나머지 모든 필드는 기존의 값이 복사됩니다.

 


이번에는 상속된 model을 clone하는 방법입니다.

class ThemeBlog(Blog):
    theme = models.CharField(max_length=200)

django_blog = ThemeBlog(name='Django', tagline='Django is easy', theme='python')
django_blog.save() # django_blog.pk == 3
django_blog.pk = None
django_blog.id = None
django_blog.save() # django_blog.pk == 4

pk와 함께 id 또한 None으로 설정해야 합니다.

 

 


단, 위와 같은 방법은 DB table에 존재하지 않는, relation들은 복사하지 않습니다.

Entry가 ManyToManyField로 Author를 가지고 있다고 해 봅시다.

entry = Entry.objects.all()[0] # some previous entry
old_authors = entry.authors.all()
entry.pk = None
entry.save()
entry.authors.set(old_authors)

위와 같이 이전의 author들을 명시적으로 복사해 주는 구문이 필요하게 됩니다.

 

 

OneToOneField일 경우, one-to-one unique constraint를 피하기 위해 연관된 객체를 복제해서 대입해 주어야 합니다.

detail = EntryDetail.objects.all()[0]
detail.pk = None
detail.entry = entry
detail.save()

entry를 미리 복제한 후, 위처럼 대입해 주면 됩니다.

 


instancesdocs.djangoproject.com/en/3.1/topics/db/queries/#copying-model-instances

 

Making queries | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

'개발 > Django' 카테고리의 다른 글

[Django] migration 후 no such table 에러  (0) 2020.07.30

댓글