【问题标题】:Combine multiple foreign key in a single field in Django serializer在 Django 序列化程序的单个字段中组合多个外键
【发布时间】:2020-08-26 11:50:05
【问题描述】:

我的模型.py

camera_choices = (
    ('0', 'Entry'),
    ('1', 'Exit'),
)
class Device(models.Model):
    DeviceId = models.AutoField(primary_key=True, db_column='DeviceId')
    DeviceName = models.CharField(max_length=50, null=True, default=None, blank=True)
    DeviceCode = models.CharField(max_length=25, null=False, blank=False)
    IpAddress = models.CharField(max_length=15, null=True, default=None, blank=True)
    Description = models.CharField(max_length=250, null=True, default=None, blank=True)
    DefaultAccess = models.BooleanField(default=True, null=True, blank=True)
    EntryCamera = models.ForeignKey(Camera, on_delete=models.CASCADE, db_column='EntryCameraId',
                                    related_name="entry_camera", null=True, blank=True, default=None)
    ExitCamera = models.ForeignKey(Camera, on_delete=models.CASCADE, db_column='ExitCameraId',
                                   related_name="exit_camera", null=True, blank=True, default=None)
    DeviceType = models.ForeignKey(DeviceType, on_delete=models.CASCADE, db_column='DeviceTypeId')
    DeviceStatus = models.SmallIntegerField(default=1, null=True, blank=True)

    class Meta:
        db_table = "Device"


class Camera(models.Model):
    CameraId = models.AutoField(primary_key=True, db_column='CameraId')
    CameraName = models.CharField(max_length=50, unique=True)
    CameraUrl = models.URLField()
    CameraType = models.CharField(max_length=30, choices=camera_choices)

    class Meta:
        db_table = "Camera"

我的序列化器.py

class DeviceListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = ['DeviceId', 'DeviceCode', 'DeviceName', 'IpAddress', 'Description', 'DefaultAccess', 'DeviceStatus',
                  'DeviceType', 'EntryCamera', 'ExitCamera']
        depth = 1

我的意见.py

def device_list(request):
    try:
        device = Device.objects.all()
        serializer = DeviceListSerializer(device, many=True, read_only=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
    except Exception as ex:
        logging.getLogger("error_logger").exception(repr(ex))

我收到了回复

[  
 {
        "DeviceId": 3,
        "DeviceCode": "DevTest3",
        "DeviceName": "",
        "IpAddress": "",
        "Description": "",
        "DefaultAccess": false,
        "DeviceStatus": 1,
        "DeviceType": {
            "DeviceTypeId": 1,
            "DeviceType": "Devicetype1",
            "DeviceTypeStatus": true
        },
        "EntryCamera": {
            "CameraId": 1,
            "CameraName": "Camera1",
            "CameraUrl": "http://www.dgdge",
            "CameraType": "0"
        },
        "ExitCamera": {
            "CameraId": 2,
            "CameraName": "Camera2",
            "CameraUrl": "http://www.hth",
            "CameraType": "1"
        }
    }
]

是否有可能得到如下输出。表示设备型号 2 具有相同型号外键的字段。是否可以将它们组合在一起

[  
 {
        "DeviceId": 3,
        "DeviceCode": "DevTest3",
        "DeviceName": "",
        "IpAddress": "",
        "Description": "",
        "DefaultAccess": false,
        "DeviceStatus": 1,
        "DeviceType": {
            "DeviceTypeId": 1,
            "DeviceType": "Devicetype1",
            "DeviceTypeStatus": true
        },
        "Cameras":[
            {
            "CameraId": 1,
            "CameraName": "Camera1",
            "CameraUrl": "http://www.dgdge",
            "CameraType": "0"
        },
        {
            "CameraId": 2,
            "CameraName": "Camera2",
            "CameraUrl": "http://www.hth",
            "CameraType": "1"
        }]
 }

]

我如何获取设备模型中未使用的相机列表(分别进入和退出)。 ?

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    我不确定你到底想做什么。但是你可以试试这样的:

    
    class HomePage(APIView):
    
        def get(self,request):
    
            #get device_data
            data = Device.objects.all()
            device_ser = DeviceListSerializer(data,many=True)
            deviceData=[]
            # print(device_ser.data)
            for record in device_ser.data:
                DeviceId = record['DeviceId']
                DeviceCode = record['DeviceCode']
    
                Cameras = []
                CameraId = record['CameraId']
                CameraName = record['CameraName']
                Cameras.append({"CameraId":CameraId, "CameraName":CameraName})
                
                deviceData.append({"DeviceId":DeviceId, "DeviceCode":DeviceCode, "Cameras":Cameras})
    
            return Response({"deviceData":deviceData})
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2017-05-24
      相关资源
      最近更新 更多