float,int 차이, json인코딩, 디코딩, json(), M2M테이블 컬럼 추가
float, int의 차이
int는 정수형, float는 실수형이다.
int(3.5)
>3
float(3.5)
>3.5
int(3)
>3
float(3)
>3.0
자매품 연산자’/‘와 ’//’
/는 결과를 float로, //는 결과를 int로 나타낸다.
json 인코딩, 디코딩
python에서 dictionary, list, tuple과 같은 object들이 post 요청으로 왔을때, 이 값들은 해당 object 형태로 인식되지 않는다. 실제 값은 단순히 object 처럼 생긴 string이 보내진다는 말이고, key값으로 접근을 할 수 없다는 말이다.
이를 해당 object트 값으로 사용하기 위해 json 디코딩을 해주어야한다.
json.loads()는 이를 디코딩 해주는 json 매서드이다.
json.dumps는 이와 반대로 object들을 json형태로 인코딩 해주는 함수이다.
json()
json()는 response의 내장 method로 response의 body의 값을 가져와 보여주는 역할을 한다.
ex)response.json(), python은 타입별로 내장 method가 있다. 예를들어 list.slice()와 같은 것들..
그러므로 .json()을 한 값에 또 .json()을 할 수 없다.
이미 .json()으로 형태가 변환되었기 때문이다.
M2M테이블에 컬럼 추가하기.
앞으로 M2M테이블을 추가할때는 through를 이용하여 테이블을 미리 생성해놓자. 만약을 위해 M2M필드에 변동사항이 생길경우 수정하기가 매우 편해진다.
이미 생성된 M2M에 컬럼을 추가하는 방법은 굉장히 번거롭다.
먼저 M2M이 종속된 모델에 새로운 연결관계를 생성해준다.
나의 경우는
hearts = models.ManyToManyField(User, related_name='hearts')
이 값을
hearts = models.ManyToManyField(User, through='HeartTime', related_name='hearts')
이렇게 바꾸고
class HeartTime(models.Model):
cloth = models.ForeignKey(Cloth, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
heart_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = "heart_time"
다음과 같은 새로운 M2M 컬럼을 생성해주려고했다.
하지만 장고는 이미 생성된 모델을 임의로 수정하는 걸 가만 두지 않는다.
위의 모델에서 hearts라는 항목을 바꾸고 migrate를 해버리면 에러속으로 빠지게될것이다.
이를 피하기 위해 hearts2라는 값으로 새로 아래에 선언을 해주고 related_name도 겹치지 않게 해주자.
그 후 migrate 과정을 통해 해당 값을 갱신 시켜주고 기존의 hearts를 삭제하고 다시 migrate를 하자.
migrate를 완료 한 후에 이제 hearts2라는 변수명을 원래 처음 값인 heart라는 이름으로 변경하자.
이 과정을 거치면 깔끔하게 수정할 수 있다.
hearts2로 두고 기존의 것을 지우지 않아도 되지만, 이 방법은 쓸모없는 code를 남겨두는 것이므로 안좋은 방법이고, 다른 사람이 봤을땐 hearts는 뭐고 hearts2는 뭐지?라고 생각할 수 있기 때문에, 깔끔하게 수정하도록 하자.
항상 makemigration 후에 sqlmigration 을 사용하여 생성된 migrate 파일에 에러가 없는지 확인하고 migrate를 하도록 하자.