2017-02-28 86 views
0

我正在創建一個api,其中顯示了組列表以及屬於該組的設備id。例如,如果有一個名爲車速表,加溼器設備和他們在家庭組落,然後我的API應該包括device_list未顯示

{ 
    "id": 1, 
    "name": "Home" 
    "device_list": [ 
    { 
     "id": "b45c56ioxa1" 
    }, 
    { 
     "id": "h4oc2d5ofa9" 
    } 
    ] 
}, 

,但我的代碼不會在API生產device_list。它只顯示名稱和編號

device_list是在特定組中的所有設備ID的列表。

這裏是我的代碼

class DeviceIdSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    class Meta: 
     model = Device 
     fields = ('id') 

class DeviceGroupSerializer(serializers.ModelSerializer): 
    name = serializers.StringRelatedField() 
    device_list = DeviceIdSerializer(read_only=False, many=True, required=False, source="groups") 
    class Meta: 
     model = DeviceGroup 
     fields = ('id', 'name', 'device_list') 

class DevicesGroupsAPIView(APIView): 
    permission_classes = (permissions.IsAuthenticated,) 
    def get(self, request, format=None): 
     """ 
      Returns a list of groups 
     """ 
     reply = {} 
     try: 
      groups = DeviceGroup.objects.all() 
      print ('reply', groups) 
      reply['data'] = DeviceGroupSerializer(groups, many=True).data 
     except: 
      reply['data'] = [] 
     return Response(reply, status.HTTP_200_OK) 

class BaseDevice(PolymorphicModel): 
    # User's own identifier of the product 
    name = models.CharField(max_length=250, blank=False, null=False) 
    # Any device should have a owner, right from the creation 
    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): 
    name = models.CharField(max_length=250, blank=False, null=False) 
+0

device_list沒有映射到任何模型數據...也許它映射到組 –

+0

我有將它映射爲組= GroupId = DeviceIdSerializer(),但我現在得到空數據對象。 – Serenity

+0

我的意思是把源設置爲'device_list = DeviceIdSerializer(read_only = False,many = True,required = False,source ='groups')',以便串行器知道從哪裏獲取數據。源需要是對象上的字段,屬性或可調用對象,因此您可能需要嘗試不同的操作,例如'groups.all' –

回答

2

我嘗試了很除了我使用models.Model作爲基礎m之外,您使用的代碼相同奧德爾。
我第一次得到了一個錯誤

fields選項必須是一個列表或元組或「所有」。得到了。 其中明確指出你的問題在哪裏。
所以我改變類中的字段選項DeviceIdSerializer

DeviceIdSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    class Meta: 
     model = Device 
     fields = ('id',) 

請注意,我添加了一個逗號(「」),這使得場一個元組,而不是因爲它是以前的字符串。
現在我得到的數據是

{ 
    "id":1, 
    "name":"test", 
    "device_list":[ 
     { 
     "id":"38ec7e152f9d49a38008c859a1022525" 
     }, 
     { 
     "id":"b0d799509260474cb092899ef84ce49c" 
     }, 
     { 
     "id":"e5c7cf8f9f5043c68c34c7b962569b08" 
     } 
    ] 
} 

是一樣的,你在找什麼...

+0

我包含名稱字段,它向我展示了我想要的結果。我確實找到了解決方案,但不知道它是如何工作的。你的回答幫助我理解,我非常感謝你。我正在解決你的答案。 – Serenity

+1

總是樂於幫助:) –

+0

你能幫我在這個http://stackoverflow.com/questions/42545648/post-group-name-with-the-multiple-device-selected?當我打localhost:8000/device_group/device_id我沒有得到表格發佈,以便我可以檢查它的工作與否。 – Serenity

1

我想你的序列化需要看起來像這樣:

class DeviceIdSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    class Meta: 
     model = Device 
     fields = ('id') 

class DeviceGroupSerializer(serializers.ModelSerializer): 
    name = serializers.StringRelatedField() 
    groups = DeviceIdSerializer(read_only=False, many=True, required=False) 
    class Meta: 
     model = DeviceGroup 
     fields = ('id', 'name', 'groups') 

或更改此:

class BaseDevice(PolymorphicModel): 
    # User's own identifier of the product 
    name = models.CharField(max_length=250, blank=False, null=False) 
    # Any device should have a owner, right from the creation 
    owner = models.ForeignKey(User, blank=False, null=False) 
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False) 
    group = models.ForeignKey('DeviceGroup', related_name="device_list", null=True, blank=True) 
+0

我試着用組,但我得到空的數據對象。我的意思是第一種方式。 – Serenity