Получите сериализацию данных более чем 1 модели - PullRequest
0 голосов
/ 19 июня 2020

У меня 3 модели

class Camera(models.Model):
    CameraId = models.AutoField(primary_key=True, db_column='CameraId')
    CameraName = models.CharField(max_length=50)

class DeviceType(models.Model):
    DeviceTypeId = models.AutoField(primary_key=True, db_column='DeviceTypeId')
    DeviceType = models.CharField(max_length=50)

class Device(models.Model):
    DeviceId = models.AutoField(primary_key=True, db_column='DeviceId')
    DeviceName = models.CharField(max_length=50)
    CameraId = models.ForeignKey(Camera, on_delete=models.CASCADE, db_column='CameraId', 
                           related_name='cameras')
    DeviceTypeId = models.ForeignKey(DeviceType, on_delete=models.CASCADE, db_column='DeviceTypeId')

Мне нужен результат сериализации JSON данных устройства, связанных с устройством

{
   'DeviceId'   : DeviceId ,
   'DeviceName' : DeviceName ,
   'CameraId'   : CameraId,
   'CameraName': CameraName ,
   'DeviceTypeId' :DeviceTypeId ,
   'DeviceType'  :DeviceType 
}

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Если вы ищете ответ получения, вы можете go для общего c представления api, получить устройство по идентификатору, и в вашей функции get вы можете иметь что-то вроде этого:

from rest_framework.response import Response
...
 device = Device.objects.get(pk=pk_passed_in_url)
 return Response({
   'DeviceId':device.DeviceId,
   'DeviceName' : device.DeviceName,
   'CameraId' : device.CameraId,
   'CameraName' : device.CameraId.CameraName,
   'DeviceTypeId' : device.DeviceTypeId,
   'DeviceType' : device.DeviceTypeId.DeviceType
})
0 голосов
/ 20 июня 2020

Вы должны переопределить свой метод get_queryset в представлении на основе классов (APIView или ListAPIView) с помощью аннотированного набора запросов. Примерно так:

def get_queryset(self):
    queryset = Device.objects.all().annotate(camera_name = F('camera__camera_name'), device_type = F('device_type__device_type'))
    return queryset

Не забудьте импортировать F из django .db.models

Также вы должны добавить поля camera_name и device_type в ваш сериализатор.

...