代码之家  ›  专栏  ›  技术社区  ›  kramer65

如何在Django Rest框架中接收我不想存储的json字段?

  •  0
  • kramer65  · 技术社区  · 5 年前

    我正在使用Django Rest框架为以下json构建一个api:

    {
        "x_id": 123,
        "message_type": "count",
        "aggregate": [{"id": 1, "count": 3}],
    }
    

    message_type . 所以如果 等于 count 聚合数组中的对象如上所示,如果 消息类型 等于 person 那么聚合数组中的对象就完全不同了。

    对于这两种不同类型的聚合,我有两个不同的模型,我想根据 消息类型 . 但是自从 不是任何模型的一部分,它没有经过验证,我不能在序列化程序中使用它 create() 方法:

    class ObservationSerializer(serializers.ModelSerializer):
        class Meta:
            model = Observation
            fields = ['x_id']
    
        def create(self, validated_data):
            print("message_type" in validated_data)  # => prints "False"
            return Observation.objects.create(**validated_data)
    

    消息类型 必需,以便我可以使用它来决定要在哪个表中存储聚合?

    0 回复  |  直到 5 年前
        1
  •  1
  •   ishak O.    5 年前

    您可能需要使用 message_type 作为GET参数。

    class ASerializer(serializers.ModelSerializer):
        class Meta:
            model = A
            fields = '__all__'
    
    
    class BSerializer(serializers.ModelSerializer):
        class Meta:
            model = B
            fields = '__all__'
    

    class MyView(APIView):
        def post(self, request, *args, **kwargs):
          message_type = request.GET.get('message_type', None)
          if message_type is not None:
    
              if message_type == 'count':
                  serializer = ASerializer(data=request.data)
              if message_type == 'person':
                  serializer = BSerializer(data=request.data)
    
              if serializer.is_valid():
                  serializer.save()
              return Response(status=HTTP_200_OK)
          return Response(status=status.HTTP_400_BAD_REQUEST)
    

    请求看起来像

    POST /api/view-path/?message_type=count or /api/view-path/?message_type=person
    {
      # Post body fields... 
    }