Django Rest Framework - 将多个到多个字段的属性序列化为POST操作

时间:2016-06-27 14:54:43

标签: python django serialization django-rest-framework

我有以下型号

class Metrics(models.Model):
    name = models.CharField(
        max_length=255,
        blank=True,
        verbose_name='Nombre'
    )
    value = models.DecimalField(
        max_digits = 5,
        decimal_places = 3,
        verbose_name = 'Valor',
        null = True,
        blank = True
    )

在另一个模型中,我与ManyToManyField模型有Metrics的关系

class PatientMonitoring(models.Model):
    metrics = models.ManyToManyField(Metrics, verbose_name='Métricas', 

)

我的serializers.py文件看起来像这样:

class MetricsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model= Metrics
        fields = ('name','value',)

class PatientMonitoringSerializer(serializers.HyperlinkedModelSerializer):
    metrics = MetricsSerializer(many=True)

    class Meta:
        model = PatientMonitoring
        fields = ('url', 'id', 'metrics')
        #depth=2

    def create(self,validated_data):
        metrics_data = validated_data.pop('metrics')
        metric = Metrics.object.create(**validated_data)
        for metric_data in metrics_data:
            Metrics.objects.create(metric=metric,**metrics_data)
        metric.save()
        return metric

结果是我的模型被序列化,但他们没有POST权限和表单视图,没有更新或创建

enter image description here

我在这里定义了创建方法,which is described用于处理模型序列化和写/后操作,但我不明白该过程是如何完成所有这些功能的。 在这种情况下,如何使用POST方法处理我的模型和属性?

* UPDATE

我通过POST执行了curl操作,例如@RossRogers和@Nirri建议我,行为如下:

curl -X POST http://localhost:8000/api/patientmonitoring/ -d "metrics=Grados" 

我收到与此create方法相关的消息

File "/home/bgarcial/.virtualenvs/nrhb_dev/lib/python3.5/site-packages/rest_framework/serializers.py", line 191, in save
    self.instance = self.create(validated_data)
  File "/home/bgarcial/workspace/neurorehabilitation-project/patient_monitoring/serializers.py", line 37, in create
    metric = Metrics.object.create(**validated_data)
AttributeError: type object 'Metrics' has no attribute 'object'
[28/Jun/2016 17:19:16] "POST /api/patientmonitoring/ HTTP/1.1" 500 104669

1 个答案:

答案 0 :(得分:1)

嗯,正如它所说,HTML输入中不支持列表。

正如您在此处看到的那样(http://www.django-rest-framework.org/topics/3.2-announcement/),计划在3.3版本中发布,但在发行说明中没有提及它。

这并不意味着您没有权限执行POST请求。尝试使用原始JSON(如您对帖子的评论中所建议的)使用DHC,Postman甚至curl发出POST请求。