当前位置: 首页 > 面试题库 >

如何将数据添加到嵌套序列化器?

张可人
2023-03-14
问题内容

我试图通过rest
API将数据添加到数据库中,但是在添加数据时遇到一些问题。因此,基本上我已经从管理页面添加了此数据,但是我想通过使用请求从其他python添加此数据。当我发送发布请求时,它表明已添加该请求,但传感器数组为空

[
    {
        "id": 1,
        "name": "Stacja 1",
        "delay_time": 123,
        "sensor": [
            {
                "id": 1,
                "name": "DS18B20",
                "type": "temperature",
                "date_created": "2020-06-26T16:30:28.657804Z",
                "value": 123.0,
                "index": 0
            },
            {
                "id": 2,
                "name": "DHT22",
                "type": "Humidity",
                "date_created": "2020-06-26T16:30:44.043847Z",
                "value": 1233.0,
                "index": 1
            },
            {
                "id": 3,
                "name": "DS18B20",
                "type": "temperature",
                "date_created": "2020-06-26T16:37:07.304961Z",
                "value": 1233.0,
                "index": 0
            }
        ]
    },
    {
        "id": 2,
        "name": "Stacja 1",
        "delay_time": 300,
        "sensor": []
    }
]

models.py

from django.db import models
class Sensor(models.Model):
    name = models.CharField(max_length=20, default='null', blank=True)
    type = models.CharField(max_length=20, default='null', blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    value = models.FloatField(null=True)
    index = models.IntegerField(null=True)

    def __str__(self):
        return str(self.name) + ' ' + str(self.type) + ' ' + ' index:' + str(self.index) + ' value:' + str(self.value)


class Station(models.Model):
    name = models.CharField(max_length=20, default='null', blank=True)
    delay_time = models.IntegerField(null=True)
    sensor = models.ManyToManyField(Sensor, null=True, default='null', blank=True)

serializers.py

from rest_framework import serializers
from .models import Sensor, Station


class SensorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sensor
        fields = '__all__'


class StationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Station
        fields = '__all__'
        depth = 1

adddata.py

import json
import requests
import serial
import time
ser = serial.Serial(

    port='/dev/ttyS0',
    baudrate = 9600,
    bytesize=serial.EIGHTBITS,
    stopbits=serial.STOPBITS_ONE,
    parity=serial.PARITY_NONE,
    timeout=1,
    )

payload={
    "username":["xxxxx"],
    "password":["xxxxxxxxx"]
}

while 1:
    x = ser.readline()
    try:
        payload2 = json.loads(x)
        r = requests.post('http://192.168.1.16/api/token/', data=payload)
        jsondata = r.json()
        headers = {}
        headers['Authorization'] = 'Bearer ' + jsondata['access']
        print(jsondata['access'])
        r = requests.post('http://192.168.1.16/data/station/', headers=headers, data=payload2)
        print(r.text)
    except:
    continue

payload2看起来像

{
  "name": "Stacja 1",
  "delay_time": 300,
  "sensor": [
    {
      "name": "DS18B20",
      "type": "temperature",
      "value": 26.5,
      "index": 0
    },
    {
      "name": "DHT22",
      "type": "temperature",
      "value": 26.5,
      "index": 1
    },
    {
      "name": "DHT22",
      "type": "humidity",
      "value": 66,
      "index": 1
    },
    {
      "name": "battery",
      "type": "voltage",
      "value": 2.104492,
      "index": 2
    }
  ]
}

问题答案:

我已经尝试过使用单站和多个传感器,但是我想您将能够进行相应的修改。

dataset

{
  "name": "Stacja 1",
  "delay_time": 300,
  "sensors": [
    {
      "name": "DHT22",
      "type": "temperature",
      "value": 26.5,
      "index": 1
    },
    {
      "name": "DHT22",
      "type": "humidity",
      "value": 66,
      "index": 1
    },
    {
      "name": "battery",
      "type": "voltage",
      "value": 2.104492,
      "index": 2
    }
  ]
}

serializers.py

class SensorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sensor
        fields = '__all__'


class StationSerializer(serializers.ModelSerializer):
    sensors = SensorSerializer(many=True)

    class Meta:
        model = Station
        fields = '__all__'

    def create(self, validated_data):
        sensor_data = validated_data.pop('sensors')
        station = Station.objects.create(**validated_data)
        station.save()
        for sensor in sensor_data:
            s = Sensor.objects.create(**sensor)
            station.sensors.add(s.id)

        return station

Django文档建议,在将对象与任何模型关联之前,需要先保存对象ManyToManyField。因此station,在添加对象ManyToMany关系之前,需要先对其进行保存。

这是我的 views.py

class AddStationAndSensorsView(CreateAPIView):
    serializer_class = StationSerializer

    def post(self, request):
        serializer = StationSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({'message': ['Added']}, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_406_NOT_ACCEPTABLE)

注意: 我已在模型中重命名sensor为。sensors``Station

models.py

from django.db import models


class Sensor(models.Model):
    name = models.CharField(max_length=20, default='null', blank=True)
    type = models.CharField(max_length=20, default='null', blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    value = models.FloatField(null=True)
    index = models.IntegerField(null=True)

    def __str__(self):
        return str(self.name) + ' ' + str(self.type) + ' ' + ' index:' + str(self.index) + ' value:' + str(self.value)


class Station(models.Model):
    name = models.CharField(max_length=20, default='null', blank=True)
    delay_time = models.IntegerField(null=True)
    sensors = models.ManyToManyField(Sensor, null=True, default='null', blank=True)

    def __str__(self):
        return self.name


 类似资料:
  • 问题内容: 我有一个嵌套列表,例如: 在将此列表插入数据库之前,我想在新列的每一行中添加一个具有相同值的“列”,例如: 例如,当原始的嵌套列表可能有数百行时,什么是最好的方法? 问题答案: 为什么不更改原始列表(如果您要这样做):

  • 我正在努力学习颤振,但我在JSON序列化上被卡住了。我在YouTube和Flitter文档中学习了一些教程,但我在序列化方面遇到了一些困难。你能帮我一点忙吗,这是为了教育目的,所以我更感兴趣的是背后的理论,而不是解决方案本身,然而,即使只有解决方案,我认为我可以尝试理解这个过程。我应该提到,我知道这一点,但在我的例子中,数据中有嵌套对象,这让我感到困惑。 作为响应数据的样本,它基本上是一个商店,每

  • 问题内容: 将空列添加到pandas对象的最简单方法是什么?我偶然发现的最好的东西是 有没有那么不合常理的方法? 问题答案: 如果我理解正确,则应填写作业:

  • 向pandas对象添加空列的最简单方法是什么?我偶然发现的最好的东西是 有没有一种不那么反常的方法?

  • 问题内容: 我正在尝试向从创建的数组中添加一列。在这种情况下,它是一个数组:(行,列)。 我想添加第九列。空或零都无所谓。 问题答案: 我认为您的问题是您希望就地添加该列,但是由于存储的numpy数据的原因,它的作用是创建连接数组的副本 所以你需要保存输出: 替代方式: 我相信这三个函数(以及)之间的唯一区别是未指定when的默认行为: 假设 假设除非输入为1d,否则 如果输入为1d,则假定在添加