繁体   English   中英

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

[英]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 ,并对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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM