Although there is no built-in method for copying model instances, it is possible to easily create new instance with all fields’ values copied. In the simplest case, you can set pk to None. Using our blog example:
간단하다 데이터베이스에 있는 인스턴스를 get 한 후,
pk 값을 지워주고 save()해주면 된다.
blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1
blog.pk = None
blog.save() # blog.pk == 2
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
# 상속 받았기 때문에 pk와 id 모두 None 시켜야함
django_blog.pk = None
django_blog.id = None
django_blog.save()
This process doesn’t copy relations that aren’t part of the model’s database table. For example, Entry has a ManyToManyField to Author. After duplicating an entry, you must set the many-to-many relations for the new entry:
관계형 테이블인 경우 모두 복사 하지 않기 때문에 전부 다 관계 설정을 해줘야 합니다.
# some previous entry
entry = Entry.objects.all()[0]
old_authors = entry.authors.all()
entry.pk = None
entry.save()'
# many-to-many 관계 authors
entry.authors.set(old_authors)
detail = EntryDetail.objects.all()[0]
detail.pk = None
detail.entry = entry
detail.save()
models.py
- 앞에 모델 참조
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
class EntryDetail(models.Model):
name = models.CharField(max_length=25)
entry = models.OneToOneField(Entry)
class ThemeBlog(Blog):
theme = models.CharField(max_length=200)