BooleanField로 설정한 필드의 값이 만약 default=false라면 모두 false로 변경된다.
간단히 테스트를 위해서 DRF로 API 서버를 만들었다. 주요 모델은 아래처럼 생겼다.
(예제코드: DRF CRUD)
모델
class Category(models.Model):
name = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Beverage(models.Model):
name = models.CharField(max_length=200)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
price = models.IntegerField()
is_available = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
서버를 실행하고 beverages에 아메리카노를 추가했다. 잘 들어가는 것을 확인할 수 있다.
PUT을 하면? 필수 필드값이 빠졌다고 안 된다.
Postman PUT
is_available은 필수값이 아니라 나머지 3개 값만 추가해서 PUT을 요청하면 잘 되는 것을 볼 수 있다.
Postman으로 테스트하면 is_available이 바뀌지 않는다. 그대로 true다.
requests PUT
아래처럼 간단히 requests로 PUT 요청을 실행한다.
import requests
data = {
'name': 'americano',
'category': 1,
'price': '3800',
}
response = requests.put('http://127.0.0.1:8000/beverages/1/', data=data)
print(response)
정상작동한다. 그런데!!! 직후 GET을 해보면 false로 바뀌는 걸 볼 수 있다.
request PATCH
import requests
data = {
'price': '3800',
}
response = requests.patch('http://127.0.0.1:8000/beverages/1/', data=data)
print(response)
이번에는 PATCH로 요청해본다.
당연히 PATCH로 하면 is_available 값이 그대로 true다.
PUT이 원래 Replace 개념이 있는 것은 알지만(참고: Q. HTTP PUT 메소드와 PATCH 메소드의 차이는?) 왜 도대체 Postman으로 하면 is_available 값이 바뀌지 않고, requests로 하면 바뀌는 걸까. 아직 그 이유는 알아내지 못했다.
결론
requests로 PUT 쓰지 말고 PATCH만 쓰자.
아니면 DRF로 API 서버 만들 때 PUT을 PATCH처럼 쓰지 말자. 정말 PUT으로 쓰자. 또는 PATCH만 쓰자.