2017-03-04 1 views
0

내 API의 디자인이 GET API의 결과입니다포스트 목록

{ 
    "id": "667c476ca953483493afa265e5d500b0", 
    "name": "Home" 
} 

입니다. 게시 할 때 장치 목록을 게시하고 싶습니다. 예를 들어 사용자가 기기를 홈 그룹에 게시하려는 경우 내가 설계 한 URL은/group/group_token/add (/ group/667c476ca953483493afa265e5d500b0/add)입니다. 데이터 전송 형식은 내 모델, 시리얼 라이저와 APIView는 내가

class BaseDevice(PolymorphicModel): 
    name = models.CharField(max_length=250, blank=False, null=False) 
    owner = models.ForeignKey(User, blank=False, null=False) 
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False) 
    group = models.ForeignKey('DeviceGroup', related_name="groups", null=True, blank=True) 

class Device(BaseDevice): 
    description = models.TextField(blank=True, null=True) 

class DeviceGroup(models.Model): 
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False) 
    name = models.CharField(max_length=250, blank=False, null=False) 
    owner = models.ForeignKey(User, blank=False, null=False) 


class DeviceGroupSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    class Meta: 
     model = DeviceGroup 
     fields = ['id','name'] 


class DevicesGroupsAPIView(APIView): 
    permission_classes = (permissions.IsAuthenticated,) 
    def get_serializer_class(self): 
     if self.request.user.is_staff: 
      return DeviceGroupSerializer 

    def get_object(self, user, token): 
     try: 
      return BaseDevice.objects.filter(owner=user).get(token=token) 
     except ObjectDoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 

    def get(self, request, format=None): 
     reply = {} 
     try: 
      groups = DeviceGroup.objects.filter(owner=request.user) 
      reply['data'] = DeviceGroupSerializer(groups, many=True).data 
     except: 
      reply['data'] = [] 
     return Response(reply, status.HTTP_200_OK) 

    def post(self, request, token=None, format=None): 
     device_group_instance = DeviceGroup.objects.get(token=token) 
     for device_token in request.data['devices']: 
      device = Device.objects.get(token=device_token, owner=request.user) 
      device.group = device_group_instance 
      device.save() 

어떻게 내가 게시 할 수있는 지금까지 수행 한 다음

{ 
"devices":[<device_id1>, <device_id2>] 
} 

i.e 

{ 
"devices":"[5ac41ba7e6ae4628982b2c81c99343a8], [7nu21ba7e6ae4628982b2c81c99343a8]" 
} 

입니까? 토큰 부분에 오류가 발생합니다. 그것은 말합니다

장치 그룹 일치하는 쿼리가 존재하지 않습니다.

게시 방법

UPDATE

프리스트 스크린 샷 URL입니다 device_group /입니다. 내가 거기에서 게시하려고 할 때. 내가 쿼리를 일치하지 않는 오류 위 얻을 하나

enter image description here

두 번째 스크린 샷

URL이 스크린 샷 브라우저입니다. 나는 오히려 나는 이름 필드를 볼 수있는 장치 목록을 게시하지 않습니다.

enter image description here

+0

은 어떻게 든, 당신은'기능을 당신의'포스트()를 통해 유효한 토큰을 제공 (또는 함수 내에서 검색)해야합니다. –

+0

죄송 합니다만 이해하지 못했습니다. 예를 보여 주시겠습니까? – milan

답변

0

나는이 작동하도록되어 있지만 post() 기능은 기존 DeviceGroup 일치하는 유효한 token를 얻을하지 않습니다 어떤 이유로 든 방법을 모르겠어요.

DeviceGroup이 전화하려는 모델인지 확인하십시오.

다른 곳에서 post()을 수동으로 인스턴스화하는 경우 유효한 token이 전달되고 있는지 확인하십시오.

그렇지 않으면 함수 자체에서 검색해야합니다. 토큰이 session variable에 저장되어있는 경우 예를 들어, 당신은 할 수 있습니다 :

def post(self, request, token=None, format=None): 

    token = request.session.token 

    device_group_instance = DeviceGroup.objects.get(token=token) 
    for device_token in request.data['devices']: 
     device = Device.objects.get(token=device_token, owner=request.user) 
     device.group = device_group_instance 
     device.save() 
+0

url/group/group_token/add를 브라우저에로드하면 특정 토큰 그룹과 게시 할 이름 필드가 표시됩니다. 하지만 게시하려면 장치 ID의 목록을 보내야합니다. – milan

+0

내 질문을 업데이트했습니다. – milan

관련 문제