如何将数据添加到嵌套序列化器?
我试图通过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