..
How Django Knows To Insert Or Update In Save Method
문제
Django에서는 데이터 추가(insert) 및 수정(update) 시, save
메소드를 이용한다.
데이터 추가 및 수정 시에 유저를 기록해야 해서 save
메소드에서 데이터를 추가하는 경우인지, 수정하는 경우인지 구분해야 했다.
def save(self, *args, **kwargs):
is_create = None # 어떤 값을 넣어야 할까
username = get_current_user().username
if is_create:
self.create_user = username
self.update_user = username
return super(AbstractLogging, self).save(*args, **kwargs)
해결
방법1
제일 많이 사용하는 방법으로 pk 값이 있는지 확인해, 데이터에 pk 값이 없다면 추가(insert)
, pk 값이 있다면 수정(update)
으로 판단한다.
is_create = not self._get_pk_val()
⚠️ 이 방법에 문제는 아래와 같이 pk가 자동 생성되는 AutoField가 아닌, 따로 pk 필드를 선언해 데이터 추가 시에 pk 데이터도 포함하는 경우라면 사용할 수 없다.
class Book(models.Model):
isbn = models.CharField(primary_key=True, max_length=20)
name = models.CharField(primary_key=True, max_length=50)
방법2
방법1보다는 방법2를 사용하는 것이 더 안전하다.
is_create = self._state.adding
참고
https://stackoverflow.com/questions/57459259/does-djangos-save-create-or-update