如何将数据添加到嵌套序列化器? [英] How to add data to nested serializers?
问题描述
我正在尝试通过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屋!