[英]POSTing foreign keys to Django Rest Framework, using Postman
因此,我为所工作的公司制作了一个简单的REST API。 这是一个附带项目,所以我仍然学到很多东西。
到目前为止,它对GET请求非常有效。 我现在面临的问题是尝试发出POST请求(目前使用Postman,其思想是将API直接连接到广播JSON数据的传感器,然后通过API将所有数据上传到我们的数据库)。
我们建立模型的方式是,数据库中有几个ForeignKey关系(如果有区别的话,我们使用PostgreSQL)。
我正在尝试发布我们最基本的信息之一,但可以说最重要的是测量数据。
数据点的模型具有参数的ForeignKey和传感器。 参数将是具有参数名称,类型,位置的模型,而传感器将是另一个模型,该模型本身具有指向会议厅的ForeignKey(另一个模型也包含其自己的ForeignKey,即对客户),以及另一个ForeignKey,即对SensorType。 。
简而言之,对于关系而言,数据与参数和传感器(与SensorType有关,而与本身与客户有关的与用户有关的Chamber)有关。
当我对“ api / parameter / create /”(参数没有ForeignKeys)执行POST请求时,它将起作用。 我可以创建虚拟参数。
因此,我可以确定我的问题在于向依赖于模型上的ForeignKey的API视图发送POST请求。
使用基本身份验证(用户/密码)在Postman上发送POST请求,并使用API的“数据”视图需要的所有字段给我以下错误:
“ / api / data / create /列“ parameter_id”中的null值处的IntegrityError违反了非null约束”
可以理解,数据点与参数本质上相关。 但是,如果我在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上的Data的代码段:
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'),
这是我从邮递员那里得到的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(这是一个动态PK,它已经存在)
例如,您需要将get_parameter
方法更改为get_parameter_name
,并对parameter
和parameter_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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.