gpt4 book ai didi

python - 使用 Postman 将外键发布到 Django Rest Framework

转载 作者:行者123 更新时间:2023-12-02 08:08:47 25 4
gpt4 key购买 nike

所以我为我工作的公司制作了一个简单的 REST API。这是一个业余项目,所以我仍在学习很多东西。

到目前为止,它对于 GET 请求效果很好。我现在面临的问题是尝试执行 POST 请求(目前使用 Postman,其想法是将 API 直接连接到广播 JSON 数据的传感器,并通过 API 将所有数据上传到我们的数据库)。

我们设置模型的方式,我们的数据库中有几个外键关系(如果这有区别的话,我们正在使用 PostgreSQL)。

我正在尝试发布我们最基本的信息之一,但可以说是最重要的信息,即测量数据。

数据点的模型具有参数的外键和传感器。参数将是一个具有参数名称、类型、位置的模型,而传感器将是另一个模型,它本身具有到 Chamber 的外键(另一个模型也包含其自己的外键,到客户),以及另一个到 SensorType 的外键.

简而言之,对于关系而言,数据与参数和传感器相关(与 SensorType 相关,与 Chamber 相关,而 Chamber 本身与 Customer 相关,而 Customer 又与 User 相关)。

当我向“api/parameter/create/”(参数没有外键)发出 POST 请求时,它可以工作。我可以创建虚拟参数。

因此,我相当确定我的问题在于向依赖于模型上的foreignkey的API View 发送POST请求。

使用基本身份验证(用户/密码)在 Postman 上发送 POST 请求,并使用 API 上的数据 View 所需的所有字段,会出现以下错误:

““parameter_id”列中/api/data/create/处的 IntegrityError 违反了非空约束”

这是可以理解的,数据点本质上与参数相关。但如果我在 JSON 正文中包含parameter_id,它仍然会给出相同的错误。

这是 API 上数据的views.py:

class DataCreateAPIView(CreateAPIView):
queryset = Data.objects.all()
serializer_class = DataCreateSerializer
permission_classes = [IsAuthenticated]
def post(self,request):
serializer = DataCreateSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

以下是 API 上的 serializers.py 数据的片段:

class DataCreateSerializer(ModelSerializer):
sensor = SerializerMethodField()
parameter = SerializerMethodField()
class Meta:
model = Data
fields = [
'id',
'time',
'sensor',
'parameter',
'parameter_value'
]
def get_sensor(self, obj):
return str(obj.sensor)
def get_parameter(self, obj):
return str(obj.parameter.parameter_name)

这是 models.py 上的数据模型

class Data(models.Model):
time = models.DateTimeField()
sensor = models.ForeignKey(Sensor, on_delete=models.CASCADE)
parameter = models.ForeignKey(Parameter, on_delete=models.CASCADE)
parameter_value = models.FloatField()

def __str__(self):
return str(self.time) + ' : ' + self.parameter.parameter_name + ' = ' + str(self.parameter_value)

def __key(self):
return self.time, self.sensor, self.parameter

def __eq__(self, y):
return isinstance(y, self.__class__) and self.__key() == y.__key()

def __hash__(self):
return hash(self.__key())

以防万一,这里是 urls.py 上的数据相关片段 URL:

    url(r'^data/$', DataListAPIView.as_view(), name='data_list'),
url(r'^data/create/$', DataCreateAPIView.as_view(), name='data_list_create'),
url(r'^data/(?P<pk>\d+)/$', DataDetailAPIView.as_view(), name='data_list_detail'),
url(r'^data/(?P<pk>\d+)/edit/$', DataUpdateAPIView.as_view(), name='data_list_update'),
url(r'^data/(?P<pk>\d+)/delete/$', DataDeleteAPIView.as_view(), name='data_list_delete'),

这是我从 Postman 获得的 JSON 简介(开头):

IntegrityError at /expert/api/data/create/
null value in column "parameter_id" violates not-null constraint
DETAIL: Failing row contains (21490030, 2010-10-10 10:10:10+00, 999999999, null, null).


Request Method: POST
Request URL: http://localhost:8000/expert/api/data/create/
Django Version: 1.10.8
Python Executable: /home/luke/.virtualenvs/expert/bin/python
Python Version: 3.5.3

当我尝试发送包含“parameter_id”的 JSON:1(这是一个 velid PK,它已经存在)

最佳答案

例如,您需要将 get_parameter 方法更改为 get_parameter_name,并为 parameterparameter_name 使用两个单独的字段>。

class DataCreateSerializer(ModelSerializer):
sensor = SerializerMethodField()
parameter_name = SerializerMethodField()
class Meta:
model = Data
fields = [
'id',
'time',
'sensor',
'parameter', # it is the field for FK model field
'parameter_name' # field for custom method
'parameter_value'
]

def get_sensor(self, obj):
return str(obj.sensor)

def get_parameter_name(self, obj):
return str(obj.parameter.parameter_name)

关于python - 使用 Postman 将外键发布到 Django Rest Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48501279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com