U E D R , A S I H C RSS

django/Modifying Object

insert & update

SQL문에서는 insert into values 구문을 이용해 레코드를 삽입하고, update set where 구문을 이용해 레코드를 수정한다. 하지만 django는 이 둘을 하나로 보고 데이터베이스에 레코드를 삽입하고 갱신하는 작업을, 모델로 만든 객체를 저장(save)하는 것으로 추상화했다. 기본적으로 모델클래스는 save메소드를 가진다. 따라서 개발자가 작성한 모델도 save메소드를 가지며, 이는 오버라이딩 할 수 있다. 아래 예에서 보듯이 save 메소드는 새로만든 레코드 필드의 속성에 따라서 적당히 삽입과 갱신 작업을 수행한다.
class Employee(models.Model):
    name= models.CharField(maxlength=100)
    email= models.EmailField()
Employee 모델에 해당하는 새로운 객체를 만들고 save메소드를 이용하면, 데이터베이스에 새로운 레코드를 삽입하거나, 기존의 레코드를 갱신한다. 기존에 삽입하지 않았기 때문에 처음 save를 호출하면 레코드를 삽입하고, 다음 번 save를 호출하면 레코드를 갱신한다. 레코드는 객체로, 레코드의 속성을 객체의 멤버 변수로 취급한다.
e= Employee(name='John', email='John@django.com')
e.save() # insert
e.name= 'jack'
e.save() # update
Screenshot-save.png
save메소드는 우선 현재 저장하려는 레코드의 키를 가지고 데이터베이스를 검색하여 레코드를 삽입할 지 갱신할 지 결정한다. 키를 이용해 기존의 레코드를 찾은 경우에는 단순히 갱신한다. 키를 이용해 레코드를 찾지 못한 경우에는 단순히 삽입한다. 만일 키가 없는데 레코드가 있는 경우에는 삽입하여도 상관이 없으므로 삽입한다. 다음은 save메소드의 요 분기점을 보여고 있다.
  def save(self):
        # First, try an UPDATE. If that doesn't update anything, do an INSERT.
        record_exists = True
        if pk_set:
            # Determine whether a record with the primary key already exists.
            cursor.execute("SELECT 1 FROM %s WHERE %s=%%s LIMIT 1" % \
            # If it does already exist, do an UPDATE.
            if cursor.fetchone():
                    cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \
            else:
                record_exists = False
        if not pk_set or not record_exists:
            if pk_set:
            # If the PK has been manually set, respect that.
            else:
                # Create a new record with defaults for everything.
                cursor.execute("INSERT INTO %s (%s) VALUES (%s)" %

delete

데이터베이스에서 레코드를 삭제하는 작업은 Model클래스의 delete메소드로 추상화했다. 하지만 내부에서 실제로 레코드를 삭제하는 메소드는 delete_objects이다.8 delete_objects메소드는 지우려는 레코드를 참조하는 다른 테이블의 레코드까지 함께 삭제하거나, 외래키를 NULL값으로 설정한다. 예를 들어 다음은 Risk테이블에서 한 레코드를 삭제하는 경우 이를 참조하는 Consequence, Control 테이블의 레코드까지 함께 삭제하는지를 묻는 사용자 화면이다.
django_delete.jpg
----
django/Example
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:38
Processing time 0.0247 sec