티스토리 뷰

원래 쓰던 테이블에 필드가 하나 더 있는 것이 좋을 것 같아서 필드를 추가하고, 들어온 값의 일부를 사용해서 해당 필드를 채우도록 save를 다음과 같이 오버라이딩했다.

 

def save(self, *args, **kwargs):
	if not self.extension:
    	self.extension = str(self.file).split(".")[-1]
    super(File, self).save(*args, *kwargs)

그리고 어드민에서 잘 동작하는 것 같아서 그냥 두고 잊어버리고 있었다.
(사실 테스트코드만 있었어도 해결가능하지만......ㅎ)
그러던 와중 앱 테스트 도중에 파일 업로드가 안된다는 얘기를 들었다.
에러 메세지는 다음과 같다.

ValueError: Cannot force both insert and updating in model saving.

 

 뭐냐 이건...
 이것저것 건드려보니까 에러 메세지가 조금 달라졌다.

 

This may be because you have a writable field on the serializer class 
that is not a valid argument to `{...}.objects.create()`. 
You may need to make the field read-only, 
or override the {....}Serializer.create() method to handle this correctly.

음? 일부를 시리얼라이저에서 read_only로 바꾸란 뜻일까?
관련해서 구글링(참고링크)을 해본 후, 재시도해봤다.

안 된다.

 

다시 구글링...을 하려다가, insert와 update를 동시에 못한다는 식의 메세지가 최초 에러였는데, save를 오버라이딩한 잘못이 아닐까 하는 생각이 들었다. 지금 새로운 인스턴스를 만들때 입력받은 데이터를 시리얼라이저에 넣고, 해당 데이터가 유효하면 save()를 통해서 생성하는데 save가 동작할때 뭔가 꼬인 것 같다.
그럼 save 대신에 create를 오버라이딩해보면 어떨까 해서 로직은 그대로 둔 채 save에서 create로 수정해봤다.

잘 동작한다.

 

오버라이딩할때 가볍게 찾아보고 오버라이딩했는데, 장고 문서를 좀 더 살펴봐야겠다ㅠ 장고 하나 잘하기도 참 어려운듯..

반응형
댓글