JustDoEat

serializer๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์‹ค์ˆ˜ํ•œ ์  ๋“ค with Json format ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

serializer๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์‹ค์ˆ˜ํ•œ ์  ๋“ค with Json format

kingmusung 2024. 1. 8. 16:15

๐Ÿ’ฃ serializer formating error

์‹œ๋ฆฌ์–ผ ๋ผ์ด์ €์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ณ„์† ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•จ.

{'non_field_errors': [ErrorDetail(string='Invalid data. Expected a dictionary, but got str.', code='invalid')]}

๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋– ์„œ, ์ฒ˜์Œ์—๋Š” ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €์˜ fields๊ฐ’์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ค„ ์•Œ์•˜์œผ๋‚˜, ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์˜ค๋ฅ˜ ๋ง ๊ทธ๋Œ€๋กœ ๋”•์…˜์–ด๋ฆฌ ํ˜•ํƒœ๋กœ ์•ˆ๋„ฃ์–ด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ด๋‹ค.

 
@staticmethod
def post(request):
    calendar_id = request.data.get('calendar_id')
    member_id = request.data.get('member_id')

    # ๋‚ ์งœ์—์„œ ์—ฐ์›”๋งŒ ์ถ”์ถœ
    year_month_day = request.data.get('diary_date')

    # ์บ˜๋ฆฐ๋”๊ฐ€ ์—†์„๋•Œ
    print(calendar_id,member_id,year_month_day)
    if calendar_id is None:
        member_instance = get_object_or_404(Member, member_id=member_id)  # ๋ฉค๋ฒ„ ์ธ์Šคํ„ด์Šค ๋ฐ›์•„์˜ค๊ธฐ
        calendar_serializer = HarucalendarCreateSerializer(data= year_month_day)  #๋‹ค์ด์–ด๋ฆฌ ์ƒ์„ฑ.
        if calendar_serializer.is_valid():
            calendar_serializer.save(member_id=member_instance)
            return Response(status=status.HTTP_201_CREATED)
        else:
            print(calendar_serializer.errors)
            return Response(status=status.HTTP_200_OK)



    else:
        return Response(status=status.HTTP_200_OK)

 

 

๐Ÿงฉ ํ•ด ๊ฒฐ

@staticmethod
def post(request):
    calendar_id = request.data.get('calendar_id')
    member_id = request.data.get('member_id')

    # ๋‚ ์งœ์—์„œ ์—ฐ์›”๋งŒ ์ถ”์ถœ
    year_month_day = request.data.get('diary_date')

    # ์บ˜๋ฆฐ๋”๊ฐ€ ์—†์„๋•Œ
    print(calendar_id,member_id,year_month_day)
    if calendar_id is None:
        member_instance = get_object_or_404(Member, member_id=member_id)  # ๋ฉค๋ฒ„ ์ธ์Šคํ„ด์Šค ๋ฐ›์•„์˜ค๊ธฐ
        calendar_serializer = HarucalendarCreateSerializer(data={'year_month_day':year_month_day})  #๋‹ค์ด์–ด๋ฆฌ ์ƒ์„ฑ.
        if calendar_serializer.is_valid():
            calendar_serializer.save(member_id=member_instance)
            return Response(status=status.HTTP_201_CREATED)
        else:
            print(calendar_serializer.errors)
            return Response(status=status.HTTP_200_OK)



    else:
        return Response(status=status.HTTP_200_OK)

 

 


์ˆ˜์ • ์ „

calendar_serializer = HarucalendarCreateSerializer(data= year_month_day)

 

์ˆ˜์ • ํ›„

 
calendar_serializer = HarucalendarCreateSerializer(data={'year_month_day':year_month_day})

 

์ˆ˜์ •์ „๊ณผ ์ˆ˜์ •ํ›„์˜ ์ฐจ์ด์ ์ด ๋ณด์ด๋Š”๊ฐ€,  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์‚ฝ์ž…ํ•œ๊ฒƒ๊ณผ, ๋”•์…˜์–ด๋ฆฌ ์•ˆ์— ๋„ฃ์–ด์„œ ์‚ฝ์ž…์„ ํ–ˆ๋Š”๊ฐ€ ์ฐจ์ด๋‹ค.

 

ํ•ด๊ฒฐ๋ฒ•์œผ๋กœ๋Š” data={} ๋”•์…˜์–ด๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๊ฒฐ์ด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ๋‹น์—ฐํ•˜๋‹ค serializer๋Š” ๋ชจ๋ธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ jsonํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™” ํ˜น์€ ์—ญ์ง๋ ฌํ™”๋ฅผ ํ•ด์ฃผ๋Š”๊ฑด๋ฐ ์•„์ง ๊ฐœ๋…์ด ์ž˜ ๋ฐ•ํžˆ์ง€ ์•Š์•˜์—ˆ๋‹ค.

serializer.py

class HarucalendarCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Harucalendar
        fields = ['year_month_day']

    def create(self, validated_data):
        return Harucalendar.objects.create(**validated_data)

๐Ÿ’ฃ Json ํ˜•์‹์— ๋Œ€ํ•œ ์ดํ•ด๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ์—๋Ÿฌ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ 2๊ฐœ ์ด์ƒ์˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™ํžˆ๊ณ  ์ €์žฅ์„ ๋ˆŒ๋ €์„๋•Œ, ์ฆ‰ 2๊ฐœ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— jsonํ˜•์‹์œผ๋กœ ๋ฐ›์•„์™”์„๋•Œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜

class HarucalendarstickerView(APIView):
    @staticmethod
    def post(request):
        try:
            calendar_id = request.data.get('calendar_id')
            calendar_sticker_id = request.data.get('calendar_sticker_id')
            exist_or_not = get_object_or_404(Harucalendar, calendar_id=calendar_id)
        except ObjectDoesNotExist:
            return Response({'error': '์ผˆ๋ฆฐ๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.'})  # ์บ˜๋ฆฐ๋” ์ƒ์„ฑ ๋กœ์ง ์ถ”๊ฐ€.

        # ํ”„๋ก ํŠธ์—์„œ ์—ด์‹ฌํžˆ ๋ถ™ํžŒ ์Šคํ‹ฐ์ปค DB ์ €์žฅ
        sticker_data = request.data.get('stickers', [])  # ์˜คํƒ€ ์ˆ˜์ •
        print(sticker_data)
        for sticker_data_ in sticker_data: 
            if 'st_image_url' not in sticker_data_: ---------->๋ฌธ์ œ์˜ ์‹œ์ž‘
                return Response({'error': '์Šคํ‹ฐ์ปค url์ด ์—†์Šต๋‹ˆ๋‹ค !'})

            serializer = HarucalendarstickerAllSerializer(data=sticker_data_)

            if serializer.is_valid():
                serializer.save(calendar_id=calendar_id, calendar_sticker_id=calendar_sticker_id)
            else:
                return Response({'error': serializer.errors}, status=400)

        return Response({'code': 'c002', 'status': '200', 'message': '์Šคํ‹ฐ์ปค ์ถ”๊ฐ€ ์„ฑ๊ณต'}, status=200)

 

๋‘๊ฐœ ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™”์„๋•Œ for๋ฌธ์—์„œ ๋ง‰ํžˆ๋Š”ํ˜„์ƒ,

sticker_data = request.data.get('stickers', [])  # ์˜คํƒ€ ์ˆ˜์ •
      print(sticker_data)
      for sticker_data_ in sticker_data: 
          if 'st_image_url' not in sticker_data_: ---------->๋ฌธ์ œ์˜ ์‹œ์ž‘

 

์•„๋ž˜๋Š” api๋ฅผ ์š”์ฒญํ–ˆ๋˜ JSONํ˜•์‹์ด๋‹ค. ์ค‘๊ด„ํ˜ธ ์•ˆ์— ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ ์ค‘๊ด„ํ˜ธ์•ˆ์˜ ๊ฐ’์„ ๋ฐ”๋กœ ๋นผ๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋˜ ๊ฒƒ ์ด๋‹ค.

    "stickers": [
      {
        "sticker_id": 0,
        "sticker_image_url": "string",
        "top": 0,
        "left": 0,
        "height": 0,
        "width": 0,
        "rotate": 0
      },
      { 
        "sticker_id": 0,
        "sticker_image_url": "string",
        "top": 0,
        "left": 0,
        "height": 0,
        "width": 0,
        "rotate": 0
		}
    ]

 

๐Ÿงฉ ํ•ด๊ฒฐ

class HarucalendarstickerView(APIView):
    @staticmethod
    def post(request):
        try:
            stickers_data = request.data.get('stickers', [])
            for sticker_data in stickers_data:
                calendar_id = sticker_data.get('calendar_id')
                sticker_url= sticker_data.get('sticker_image_url')
                if calendar_id is None:
                    return Response({'error': 'stickers ๋‚ด๋ถ€์˜ calendar_id๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.'},
                                    status=status.HTTP_400_BAD_REQUEST)
               ''' ์ƒ๋žต'''

 

 

โœ๏ธ  ๋Š๋‚€์  ๋ฐ ๋ฐฐ์šด์ .

 

{
  "stickers": [
    {
      "calendar_id": 1,
      "sticker_image_url": "s65222465464ddd",
      "xcoor": 50,
      "ycoor": 100,
      "height": 60,
      "rolate": 80,  
      "width": 50
    },   
      "calendar_id": 1,
      "sticker_image_url": "s22d2wsddaadd",
      "xcoor": 5022,
      "ycoor": 10022,
      "height": 6022,
      "rolate": 8022,  
      "width": 5022
    }
  ]
}

๐Ÿ’ฅ 2๊ฐœ ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ์‹œ์—๋Š” ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ์„ ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ’ฅ ์ด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค..

 

2๊ฐœ ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์‹œ ํฌ๋ฌธ ์•ˆ์—์„œ ํ•˜๋‚˜์”ฉ ๋ฐ›์•„์„œ ๋กœ์ง์„ ์งœ์•ผํ•œ๋‹ค.

-> ๋‹น์—ฐํ•œ ๋ง์ธ๋ฐ jsonํ˜•ํƒœ๊ฐ€ ์ƒ์†Œํ•ด์„œ ์‹ค์ˆ˜๋ฅผ ํ•œ๊ฑฐ ๊ฐ™๋‹ค.

 

 

+์‹œ๋ฆฌ์–ผ๋ผ์ด์ €๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”, ์ฆ‰ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €์— ๋‚ด๊ฐ€ ์ง€์ •ํ•œ fields=['','','','']  ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹๊ณผ ์ž…๋ ฅ์œผ๋กœ ๋ณด๋‚ธ๊ฐ’๊ณผ ํ˜•์‹์ด ์ผ์น˜ํ•ด์•ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค.

+serializer.save(์™ธ๋ž˜ํ‚ค๊ด€๊ณ„= ์ธ์Šคํ„ด์Šค), ์ €์žฅ ํ•˜๋ ค๋Š” model์— ์™ธ๋ž˜ํ‚ค ๊ด€๊ณ„์— ์žˆ๋Š” model์— ๋Œ€ํ•ด ์™ธ๋ก€ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์ด๋‹ค.

member_instance=get_object_or_404(pk=member_id)

diary_serializer(data=data) -> diary_serializer.is_valid() ----์ฐธ----> diary_serializer.save(fk=member_instance)