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

发布于 2021-01-29 15:02:21

我试图通过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
    }
  ]
}
关注者
0
被浏览
62
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看