如何将额外参数发送到模型中未包含的序列化程序?

时间:2019-01-25 00:02:15

标签: django django-rest-framework

我需要将模型中不存在的参数发送给序列化器,因此序列化器会删除此数据

我还有一个带有自定义.create()函数的嵌套序列化器

这是前端ajax发送的请求数据。

 request data = {'data': [{'usuario': 269, 'coworkers': [328, 209], 'inicio': '2019-01-24T23:30:43.926Z', 'estado': 'progress', 'operacion': {'orden': 24068, 'proceso': 'ALEZADO FINAL-TORNO CNC T7 1'}}, {'usuario': 269, 'coworkers': [208, 212], 'inicio': '2019-01-24T23:30:43.926Z', 'estado': 'progress', 'operacion': {'orden': 24067, 'proceso': 'ALEZADO FINAL-TORNO CNC T7 1'}}]}

型号:

class TiempoOperacion(models.Model):
    inicio = models.DateTimeField(blank=True, null=True)
    fin = models.DateTimeField(blank=True, null=True)
    operacion = models.ForeignKey(Operacion, related_name='tiempos', on_delete=models.CASCADE)
    cantidad = models.IntegerField(default=0)
    usuario = models.CharField(max_length=40)
    motivo_pausa = models.CharField(max_length=140, default=None, null=True)
    estado = models.CharField(
        max_length=15,
        choices=TASKS_STATUS_CHOICES,
        default=UNACTION,
    )

视图集:

class TiempoOperacionViewSet(CustomViewSet):

    model_class = TiempoOperacion
    serializer_class = TiempoOperacionSerializer
    pagination_class = SmallResultsSetPagination
    order_by = '-inicio'

    def create(self, request):
        datos = request.data.get('listorders') if 'listorders' in request.data  else request.data

        tiemposerializer = self.serializer_class(data=datos, many=True, fields=('coworkers', 'operacion'))

        if tiemposerializer.is_valid():
            tiemposerializer.save()
            return Response(tiemposerializer.data)
        else:
            return Response(tiemposerializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化器:

class TiempoOperacionSerializer(serializers.ModelSerializer):
    operacion = OperacionSerializer()

    class Meta:
        model = TiempoOperacion
        fields = '__all__'

    def create(self, validate_data):
        operacion_data = validate_data.pop('operacion')
        print (f"\n\n validate_data : {validate_data} \n\n")

        if not operacion_data:
            raise ValidationError({
                'operacion': 'This field object is required.'
            })

        coworkers = validate_data.get('coworkers')

        query_operaciones = Operacion.objects.filter(**operacion_data)[:1]
        if query_operaciones.count() > 0:
            operacion = query_operaciones[0]
        else:
            operacion = Operacion.objects.create(**operacion_data)
        tiempo_obj = validate_data
        tiempo = TiempoOperacion.objects.create(operacion=operacion, **tiempo_obj)
        if coworkers:
            tiempos_list = []

            for coworker in coworkers:
                tiempo_obj.update({'usuario': coworker})
                tiempos_list.append(TiempoOperacion(operacion=operacion, **tiempo_obj))

            tiempos = TiempoOperacion.objects.bulk_create(tiempos_list)

        return tiempo

我希望在coworkers序列化函数中获得create

但是我只有:

validate_data : {'inicio': datetime.datetime(2019, 1, 24, 18, 12, 25, 251000, tzinfo=<DstTzInfo 'America/Bogota' -05-1 day, 19:00:00 STD>), 'usuario': '269', 'estado': 'progress'}

1 个答案:

答案 0 :(得分:0)

重新编写to_internal_value函数

class TiempoOperacionSerializer(serializers.ModelSerializer):
    operacion = OperacionSerializer()

    class Meta:
        model = TiempoOperacion
        fields = '__all__'

    def create(self, validate_data):
        operacion_data = validate_data.pop('operacion')

        if not operacion_data:
            raise ValidationError({
                'operacion': 'This field object is required.'
            })

        coworkers = validate_data.pop('coworkers')

        query_operaciones = Operacion.objects.filter(**operacion_data)[:1]
        if query_operaciones.count() > 0:
            operacion = query_operaciones[0]
        else:
            operacion = Operacion.objects.create(**operacion_data)
        tiempo_obj = validate_data
        tiempo = TiempoOperacion.objects.create(operacion=operacion, **tiempo_obj)
        if coworkers:
            tiempos_list = []

            for coworker in coworkers:
                tiempo_obj.update({'usuario': coworker})
                tiempos_list.append(TiempoOperacion(operacion=operacion, **tiempo_obj))

            tiempos = TiempoOperacion.objects.bulk_create(tiempos_list)

        return tiempo

    #This function rewrite the value validated_data mentioned in above function
    def to_internal_value(self, data):
        if not "coworkers" in data:
            data['coworkers'] = []
        return data