如何将数据添加到嵌套序列化器? [英] How to add data to nested serializers?

查看:56
本文介绍了如何将数据添加到嵌套序列化器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to add data to my database by rest API and I have some problems with adding the data. So basically I have added this data from the admin page, but I want to add this from my other python by using requests. When I'm sending post request it shows me that it has been added, but sensor array is empty

[
    {
        "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

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)

序列化器.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

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看起来

payload2 looks like

{
  "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
    }
  ]
}


推荐答案

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

I have tried for single station and multiple sensors, but I guess you will be able to modify it accordingly.

数据集

{
  "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 的情况下,需要先保存对象,然后才能将其与任何模型关联。因此,在您添加 ManyToMany 关系之前,需要保存您的 station 对象。

Django docs suggests, object needs to saved before associating it with any model in case of ManyToManyField. So your station object needs to be saved before you add ManyToMany relation to it.

这是我的 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重命名为 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

这篇关于如何将数据添加到嵌套序列化器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆