首页 > 解决方案 > 如何在我的数据库中添加数据以使用 django 和 DRF

问题描述

我正在制作一个 API,它使用 DRF 来接收 Arduino 的数据并将其发送到 Android。首先,我们成功地创建了一个显示存储在 DB 中的值的 API。但是,在生成将 Arduino 的数据发送到 DB 的 API 时存在问题。通常输入数据,但不存储该数据。你能告诉我我的代码的问题吗?这是我的代码

视图.py

from .models import arduino
from .serializers import arduinoSerializers
from rest_framework.viewsets import ViewSet, ModelViewSet
from rest_framework.response import Response

class arduinoToAndroidViewSet (ViewSet) :
    def dataSend (self, request) :
        user = self.request.user
        queryset = arduino.objects.filter(name=user)
        serializer = arduinoSerializers(queryset, many=True)
        return Response(serializer.data)

class arduinoToDatabaseViewSet (ModelViewSet) :
    serializer_class = arduinoSerializers

    def get_queryset(self) :
        user = self.request.user
        return arduino.objects.filter(name=user)

    def dataReceive(self, request) :
        queryset = get_queryset()
        serializer = arduinoSerializers(queryset, many=True)
        serializer.save()
        return Response(serializer.data)

序列化程序.py

from rest_framework import serializers
from .models import arduino

class arduinoSerializers (serializers.ModelSerializer) :
    name = serializers.CharField(source='name.username', read_only=True)
    class Meta :
        model = arduino
        fields = ('name', 'temp', 'humi')

模型.py

from django.db import models
from django.contrib.auth.models import User

class arduino (models.Model) :
    name = models.ForeignKey(User, related_name='Username', on_delete=models.CASCADE, null=True)
    temp = models.FloatField()
    humi = models.FloatField()

    def __str__ (self) :
        return self.name.username

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


如果您所指的问题是您的dataReceive(self, request)方法尽管具有有效 queryset的数据但没有保存数据(无法理解为什么要再次查询和保存保存对象),那是因为您必须始终is_valid()在尝试保存之前调用。所以应该是

def dataReceive(self, request) :
    queryset = get_queryset()
    serializer = arduinoSerializers(queryset, many=True)
    if serializer.is_valid():
        serializer.save()
    return Response(serializer.data)

推荐阅读