2016-07-29 2 views
0

API를 작성하고 Shipping 모델의 모든 데이터를 GET 메소드로 리턴하는 방법을 알아 내려하지만 POST 메소드를 통해 pk를 계속 보냅니다.Django rest framework Django rest framework 모든 데이터를 가져 오지만 POST pk

이미 일부 솔루션 herehere을 읽었지만 일부 문제에서 클라이언트가 기본 키만 보내야하는 두 가지 다른 동작이 필요합니다.

나는 나의 GET /Shipping이 생길 수

[{ 
    "pk": 1, 
    ... 
    "city_of_origin": { 
     "pk": 1, 
     "name": "San Francisco", 
     "state": { 
      "pk": 1, 
      "initial": "CA", 
      "name": "California" 
     } 
    }, 
    "destination_cities": [ 
     { 
      "pk": 2, 
      "name": "San Jose", 
      "state": { 
       "pk": 1, 
       "initial": "CA", 
       "name": "California" 
      } 
     },{ 
      "pk": 3, 
      "name": "Los Angeles", 
      "state": { 
       "pk": 1, 
       "initial": "CA", 
       "name": "California" 
      } 
     } 
    ] 
}] 

그리고 이것은 내 POST에 :

[{ 
    "pk": 1, 
    ... 
    "city_of_origin": 1, 
    "destination_cities": [2, 3] 
}] 

나는 변경하려고했는데 내 serializers.py :

class StateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = State 

class CitySerializer(serializers.ModelSerializer): 
    state = StateSerializer() 

    class Meta: 
     model = City 

class ShippingSerializer(serializers.ModelSerializer): 
    city_of_origin = CitySerializer() 
    destination_cities = CitySerializer(many=True) 

    class Meta: 
     model = Shipping 

그것을 모든 데이터를 반환하는 데는 효과적 이었지만 모든 API 루트 양식이 변경되어 도시와 주를 만들도록 강요되었습니다. 내 배송에 맡겨져 있습니다. 여기에서 시리얼 라이저를 변경하기 전에 도시와의 드롭 다운 메뉴가 있습니다. 그러나이 드롭 다운의 전시는 내가 POST 양식에 기대하는 행동입니다.

은 여기입니다 내 models.py :

class Shipping(models.Model): 
    city_of_origin = models.ForeignKey(City, related_name='origin', default=None) 
    destination_cities = models.ManyToManyField(City, related_name='destiny', default=None) 

class City(models.Model): 
    name = models.CharField(blank=False, null=True, max_length=255) 
    state = models.ForeignKey(State, null=True) 

    def __str__(self): 
     return self.name 

class State(models.Model): 
    name = models.CharField(blank=False, null=True, max_length=255) 
    initial = models.CharField(max_length=2, blank=False, null=True) 

    def __str__(self): 
     return self.name 

내가 사전에 모든 너희들이 나에게 제공 할 수있는 도움에 감사드립니다.

편집 : 나는 장고 1.9.5과 장고 나머지 프레임 워크를 사용하고 3.3.3

답변

1

만약 getpost 같은 나머지 API를보기에 의해 처리되고있다, 나는 당신이 ViewSet 같은 것을 사용하고 생각 (또는 적절하게 혼합 된 GenericAPIView). ViewSet은 가져 와서 게시 할 때 다른 serializer를 사용합니다. 당신은 당신이 이미 만든 하나를 사용합니다 목록/점점

(의 이름을 바꿀 수 있습니다) : 게시

class ShippingGetSerializer(serializers.ModelSerializer): 
    city_of_origin = CitySerializer() 
    destination_cities = CitySerializer(many=True) 

    class Meta: 
     model = Shipping 

:

class ShippingPostSerializer(serializers.ModelSerializer): 
    city_of_origin = serializers.PrimaryKeyRelatedField() 
    destination_cities = serializers.PrimaryKeyRelatedField(many=True) 

    class Meta: 
     model = Shipping 

귀하의 뷰셋이 같은 get_serializer()의 정의를 할 것이다 :

class ShippingViewSet(viewsets.ModelViewSet): 

    queryset = Shipping.objects.all() 

    def get_serializer_class(self): 
     if self.request.method == 'POST': 
      return ShippingPostSerializer 
     return ShippingGetSerializer 

get 및 pos에 대해 두 가지 다른보기를 사용하는 경우 t 진입 점에서, 내가 작성한대로 해당 serializer에 serializer_class 클래스 속성을 할당하여 각각을 작성하십시오.

+0

죄송합니다. 언급하는 것을 잊어 버렸지 만, 이런 종류의 ViewSet을'ModelViewSet'과 queryset 및 serializer 클래스의 기본 선언으로 사용하고있었습니다. 당신의 솔루션은 완벽하게 작동했습니다. 매우 감사드립니다. 감사합니다! – moshemeirelles

관련 문제