내일배움캠프 58일차

김서영·2022년 11월 24일
0

내일배움캠프 TIL

목록 보기
60/85
post-custom-banner

1. 오늘 내가 한 일!

딥러닝 모델을 장고에 연결하는 일을 했다! 진짜 진짜 어렵다...😖🙁

2. 문무해알

- Serializer와 Foreignkey의 관계

- 문제점

serializer를 views.py에서 사용하며 is_valid함수를 사용할 때 자꾸 400 BadRequest가 결과로 나왔다!

- 무엇을 몰랐는지(내가 한 시도)

user 정보가 담기지 않는 것 같아 user정보 관련하여 이것저것 추가해 보았는데 해결할 수 없었다ㅠㅠ그러던 중 다른 분에게 물어보다가 is_valid함수와 serializer 사이에 문제가 있음을 깨달았다!

- 해결 방법

  • views.py
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)
  • serializers.py
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에서 외래키필드는 제외해주자!

3. choice를 통한 드롭다운 메뉴 만들기

1. Choices에 넣을 인자로 '튜플로 이루어진 튜플'을 만들기

BRAND_CHOICES = (
		('MERCEDES','Mercedes'),
		('TESLA','Tesla'),
        ('BMW', 'Bmw'),
        ('AUDI', 'Audi')
)

여기에서 튜플의 1번째에 위치해 있는 값이 모델에서 내부적으로 받아들이는 값이고, 2번째에 위치해있는 값은 우리가 드롭다운 메뉴에서 실제로 보게 될 글자이다.

2. 모델 만들기

class Cars(models.Model):
	brand = models.CharField(max_length=200, choices = BRAND_CHOICES)

여기서 우리가 드롭다운 메뉴를 적용할 필드는 brand이고, 해당 필드에 choice라는 이름으로 앞서 정의한 튜플 값을 넣는다.

3. 어드민 페이지에서 확인하기

실제로 어떤식으로 보이는지 admin 페이지에서 확인해보면

튜플의 2번째 값들이 메뉴의 값들로 들어간 것을 볼 수 있다.

4. 우리 팀 프로젝트에서 사용한 choice

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)

참고자료 : https://yeko90.tistory.com/entry/%EC%9E%A5%EA%B3%A0-%EA%B8%B0%EC%B4%88-choices%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%93%9C%EB%A1%AD-%EB%8B%A4%EC%9A%B4-%EB%A9%94%EB%89%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0

profile
개발과 지식의 성장을 즐기는 개발자
post-custom-banner

0개의 댓글