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

Django REST:如何防止特定模型字段的值被序列化?

  •  0
  • barciewicz  · 技术社区  · 6 年前

    我有一个这样的模型:

    class Test(models.Model):
        textjson = models.TextField(default="Unassigned")
    

    田野 textjson 将JSON保存为字符串:

    `'{"distance": 31702.1, "link": "www.strava.com/activities/2020494234", "athlete": 1, "average_speed": 6.499, "name": "Afternoon Ride", "start_date": "2018-12-16T12:13:42Z", "country": "Poland", "number": 2020494234, "date_added": "2018-12-16T20:14:01.362215Z"}`'
    

    class ListTestsView(generics.ListAPIView):
        serializer_class = TestSerializer
    
        def get_queryset(self):
            tests = Test.objects.all()
            return tests
    

    我把模型连载成这样:

    class TestSerializer(serializers.ModelSerializer):
        class Meta:
            model = Test
            fields = '__all__'
    

    jsontext 调用API视图并出现反斜杠时要再次序列化的字段:

    [
        {
            "id": 1,
            "textjson": "{\"distance\": 31702.1, \"link\": \"www.strava.com/activities/2020494234\", \"athlete\": 1, \"average_speed\": 6.499, \"name\": \"Afternoon Ride\", \"start_date\": \"2018-12-16T12:13:42Z\", \"country\": \"Poland\", \"number\": 2020494234, \"date_added\": \"2018-12-16T20:14:01.362215Z\"}"
        }
    ]
    

    如何重写 TestSerializer 仅用于防止的类 这个 价值 属于 要序列化的字段?

    to_representation to_internal_value

    3 回复  |  直到 6 年前
        1
  •  0
  •   barciewicz    6 年前

    我已经找到办法了。需要编写自定义序列化程序字段并重写其 to representation 方法:

    class CustomJSONField(serializers.Field):
        """Converts only value, not name, of a field into Javascript-friendly JSON,
         not Python object or backslashed JSON. Simply avoiding the field value,
         which is a string already, being serialized again"""
        def to_representation(self, value):
            return json.loads(value)
    
    class TestSerializer(serializers.ModelSerializer):
        textjson = CustomJSONField()
        class Meta:
            model = Test
            fields = '__all__'
    

    如果存储在字段中的JSON是字典列表的字符串表示,则可以执行以下操作:

    import ast
    
    class CustomJSONField(serializers.Field):
        def to_representation(self, value):
            return ast.literal_eval(value)
    
        2
  •  0
  •   Ngoc Pham    6 年前

    你可以定义 serializers.SerializerMethodField() textjson_original 如下所示:

        from rest_framework import serializers
        class TestSerializer(serializers.ModelSerializer):
            textjson_original = serializers.SerializerMethodField()
            @staticmethod
            def get_textjson_original(item):
                return item.textjson
            class Meta:
                model = Test
                fields = '__all__'
    
        3
  •  0
  •   JPG    6 年前

    使用 serializers.JSONField()

    class TestSerializer(serializers.ModelSerializer):
        textjson = serializers.JSONField() # here &lt&lt&lt&lt&lt
    
        class Meta:
            model = Test
            fields = '__all__'