Я создаю API, где отображается список групп вместе с идентификатором устройств, которые подпадают под эти группы. Например, если есть устройство под названием «Спидометр», «Увлажнитель» и они относятся к домашней группе, тогда мой API должен включать

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

Но мой код не производит device_list в API. Он показывает только имя и идентификатор

Список_устройств - это список всех идентификаторов устройств в определенной группе.

Вот мой код

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
Serenity 28 Фев 2017 в 18:49

2 ответа

Лучший ответ

Я опробовал тот же код, что и у вас, за исключением того, что использовал models.Model в качестве базовой модели.
Первый раз я получил ошибку

Параметр 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"
      }
   ]
}

Что то же самое, что вы ищете ...

2
Resley Rodrigues 2 Мар 2017 в 12:29

Я думаю, что ваши сериализаторы должны выглядеть так:

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)
1
themanatuf 28 Фев 2017 в 16:10