딥러닝 모델을 장고에 연결하는 일을 했다! 진짜 진짜 어렵다...😖🙁
serializer를 views.py에서 사용하며 is_valid함수를 사용할 때 자꾸 400 BadRequest가 결과로 나왔다!
user 정보가 담기지 않는 것 같아 user정보 관련하여 이것저것 추가해 보았는데 해결할 수 없었다ㅠㅠ그러던 중 다른 분에게 물어보다가 is_valid함수와 serializer 사이에 문제가 있음을 깨달았다!
def post(self, request, filter_id):
data = request.data
filter = Filter.objects.get(id=filter_id)
filter_name = filter.filter_image
slz = ImageStorageSerializer(data=data)
if slz.is_valid():
outputimage = slz.save(user=request.user, filter_id=filter_id)
class ImageStorageSerializer(serializers.ModelSerializer): #인풋인미지와 아웃풋이미지 담는 시리얼라이즈
input_img = serializers.FileField(required=False)
class Meta:
model = Image
fields = ("pk", "input_img", "output_img")
내가 serializer에서 사용하던 모델은 User모델을 foreignkdy로 참조하고 있었는데 이 때 serializer field를 all로 두면 is_valid함수를 사용할 때 user에 대한 데이터도 필요하게 된다. 하지만 이 데이터는 참조함수이기 때문에 데이터가 없어서 에러가 나게 되는 것이다!!
serializer field를 all말고 필요한 정보만 넣어주고, views.py에서 save를 할 때 user=request.user를 적어주면 된다!!
is_valid함수를 사용할 때 serializers.py에서 외래키필드는 제외해주자!
BRAND_CHOICES = (
('MERCEDES','Mercedes'),
('TESLA','Tesla'),
('BMW', 'Bmw'),
('AUDI', 'Audi')
)
여기에서 튜플의 1번째에 위치해 있는 값이 모델에서 내부적으로 받아들이는 값이고, 2번째에 위치해있는 값은 우리가 드롭다운 메뉴에서 실제로 보게 될 글자이다.
class Cars(models.Model):
brand = models.CharField(max_length=200, choices = BRAND_CHOICES)
여기서 우리가 드롭다운 메뉴를 적용할 필드는 brand이고, 해당 필드에 choice라는 이름으로 앞서 정의한 튜플 값을 넣는다.
실제로 어떤식으로 보이는지 admin 페이지에서 확인해보면
튜플의 2번째 값들이 메뉴의 값들로 들어간 것을 볼 수 있다.
class Filter_option(models.Model):
SIZE = 'SIZE'
OPTION = 'OPTION'
TYPE_CHOICES = (
(SIZE, 'size'),
(OPTION, 'option')
)
filter = models.ForeignKey(Filter, on_delete=models.CASCADE)
value = models.CharField(max_length=100) # size=6x8 / size=8x10 / 달력
price = models.IntegerField()
type = models.CharField(max_length=100, choices=TYPE_CHOICES)