【RestFramework】 관련 모델 일람을 출력한다

관련 모델을 출력하는 법을 배웠으니 참고



전제



각 도도부현과 시구정촌이 관련된 모델을 준비
  • Pref는 도도부현
  • City는 시구정촌을 가리킨다
  • class Pref(models.Model):
        pref_name = models.CharField(max_length=255, blank=True)
        pref_code = models.CharField(max_length=255, blank=True)
    
        def __str__(self):
            return self.pref_name
    
    
    class City( models.Model ):
        city_name = models.CharField( max_length=255, blank=True )
        city_code = models.CharField( max_length=255, blank=True )
        pref = models.ForeignKey(Pref, on_delete=models.CASCADE, blank=True)
    
        def __str__(self):
            return self.city_name
    
    

    데이터 등록



    1. 관리 화면에서 적절하게 모델에 데이터를 등록한다.

    이번은 테스트이므로 이런 느낌으로 등록했다.

    도도부현





    시구정촌




  • 키사라즈, 도미시는 지바현에 묶는다
  • 토와다시는 아오모리 현에 묶는다
  • 삿포로시 주오구는 홋카이도에 연결한다

  • Serializer 등록



    Serializer의 세세한 작성 방법은 할애합니다.
    이번에는 Pref에 붙어있는 City 일람을 취득하는 것을 큰 목적으로 합니다.
    from rest_framework import serializers
    from .models import Pref, City, Plan
    
    
    class CitySerializer(serializers.ModelSerializer):
    
        class Meta:
            model = City
            fields = ['id', 'city_name', 'city_code']
    
    
    class PrefSerializer(serializers.ModelSerializer):
    
        city = serializers.SerializerMethodField()
    
        class Meta:
            model = Pref
            fields = ['id', 'pref_name', 'pref_code', 'city']
    
        def get_city(self, obj):
            try:
                city_child = CitySerializer(City.objects.all().filter(pref=Pref.objects.get(id=obj.id)),many=True).data
                return city_child
            except:
                city_child = None
                return city_child
    
    
    

    포인트


  • PrefSerializer에 city = serializers.SerializerMethodField() 추가하기
  • 자식 요소의 city 객체를 def get_city로 검색하는 것입니다.

  • 아래 코드는 CitySerializer에서 city 객체 목록을 검색하고 필터에서 관련 Pref 객체를 검색합니다.
    마지막으로, .data 를 붙이지 않으면 에러가 됩니다.
    city_child = CitySerializer(City.objects.all().filter(pref=Pref.objects.get(id=obj.id)),many=True).data
    

    보기



    이번에는 APIView를 상속하여 목록을 얻었습니다.
    from django_filters import rest_framework as filters
    from rest_framework import status, views
    from rest_framework.response import Response
    from rest_framework.exceptions import ValidationError
    
    from .models import Pref, City
    from .serializer import PrefSerializer, PlanSerializer, CitySerializer
    
    class PrefFilter(filters.FilterSet):
    
        class Meta:
            model = Pref
            fields = '__all__'
    
    
    class PrefListApiView(views.APIView):
    
        def get(self, request, *args, **kwargs):
            #Prefオブジェクトを取得
            filter_set = PrefFilter(request.query_params, queryset=Pref.objects.all()) 
            #バリデーション
            if not filter_set.is_valid():
                raise ValidationError(filter_set.errors)
    
         #serializerインスタンスの作成
            serializer = PrefSerializer(instance=filter_set.qs, many=True)
            # serializerをレスポンス
            return Response(serializer.data, status.HTTP_200_OK)
    

    결과는 이런 느낌





    city_code 넣어 잊어버린...

    고마워요.

    좋은 웹페이지 즐겨찾기