Copying model instances

dooh kim·2020년 9월 10일
0

queryset-tutorial

목록 보기
4/5

Copying model instances

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

Blog class 상속 받는 ThemeBlog case


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() 

many-to-many 관계 복사

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)

OneToOneField 관계 복사


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)
    
profile
testify to the light

0개의 댓글