Django

SerializerのUpdateを理解したい(Total:19day61h)

公開未公開フラグを切替更新機能を実装するぞ

Serializerの中身に、data の中で idは存在しているけど、どうしても取り出せない…

class YearMonthOpenFlagChangeAPI(generics.UpdateAPIView):
    queryset = YearMonth.objects.all()
    serializer_class = YearMonthSerializer
    model = YearMonth
    
    def put(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        
        if serializer.is_valid():
            year_month_id = year_month_id = serializer.data.get('id')
            flg = serializer.data.get('open_flg')
            print(year_month_id, flg)
            if request.user.is_superuser == True:
                return Response(YearMonthGetAPI())  
            else:
                raise PermissionDenied(
                    _('管理者でないので実行できないです。管理者へご連絡ください')
                )
        else:
            print(serializer.data.get('id'))
            print(serializer.data)
    
    def get_queryset(self):
        print('AAAAAAAAAAA')
        queryset = YearMonth.objects.filter(year_month_id=id)

色んな形でprint することで、確かめていきますがなぜか今は、is_validは何も設定していないの原因かelsseに処理が流れてきます。

そのprint(serializer.data.get('id')) は、None で、print(serializer.data) は、{'open_flg': '公'} と表示される…

うーん、原因を考えてみる。

ひょっとして、Serializerで指定している項目以外は、送られてきたものも処理ができない仕様なのかも。

Vue側で、リクエストするとき ID → year_month_id に変更する

  //公開非公開切替
  async getOpenFlagChaenge() {
    const res = await $api.yearmonth.getOpenFlagChaenge({
      year_month_id: this.items[0].year_month_id,
      open_flg: this.items[0].open_flg})
  }

まず、画面で処理をidからyear_month_id に変更する。

次に、リクエストするときのdataを付与する処理をid→year_month_idに変更します。

// 公開フラグ切替
export function getOpenFlagChaenge(data: {year_month_id: number, open_flg: string}) {
  return (
    api.request({
      method: 'put',
      url: `api/yearmonth/open_flg_chenge`,
      data
    })
  )
}

これで実行結果を確認

None
{'open_flg': '公'}

はい、なにも変化なーし💦

仮説失敗

なぜか不思議な現象

class YearMonthOpenFlagChangeAPI(generics.UpdateAPIView):
    queryset = YearMonth.objects.all()
    serializer_class = YearMonthSerializer
    model = YearMonth
    
    def put(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            year_month_id = year_month_id = serializer.data.get('year_month_id')
            flg = serializer.data.get('open_flg')
            print(year_month_id, flg)
            if request.user.is_superuser == True:
                return Response(YearMonthGetAPI())  
            else:
                raise PermissionDenied(
                    _('管理者でないので実行できないです。管理者へご連絡ください')
                )
        else:
            print(serializer.data)
    
    def get_queryset(self):
        print('AAAAAAAAAAA')
        queryset = YearMonth.objects.filter(year_month_id=id)

ちょっと不思議な現象が発生…

eslseの中でserializer.dataの中身がopen_flgしか表示されないのです。

てことは、is_validないで消されている?

でも、elseのなかでserializerをプリントすると、data={'year_month_id': 167, 'open_flg': '公'}):

と表示されてあるのには間違いないのです。

ごろう
地道に少しづつ理解を深めていく!また、明日がんばろう!

-Django

© 2022 ごろう@縁紡ぐ