首页 > 解决方案 > Django-rest-framework 如何验证 JSON 对象(不是 JSON 值)

问题描述

我目前正在尝试在models.py中仅使用数据字段进行发布请求:

class Filter(models.Model):
    class Meta:
        verbose_name_plural = "Filter"
        verbose_name = "Filter"
        db_table= "listing_filter"

    data = JSONField(default={})

    user = models.ForeignKey('backend.user', on_delete=models.CASCADE)

我有以下序列化程序,我在 drf 文档文档之后使用 JSONField :

class FilterSerializer(serializers.ModelSerializer):
    data = serializers.JSONField(required=True)
    user = serializers.CharField(required=False)

    class Meta:
        model = Filter
        fields = ('__all__')

并在 APIView 中使用它:

class FilterView(APIView):
   def post(self, request):
        login_user = request.user
        received_json_data=json.loads(request.body)
        valid_ser = FilterSerializer(data=received_json_data)
        if valid_ser.is_valid():
            post_data = received_json_data["data"]
            filter = Filter.objects.create(data=post_data, user=login_user)
            filter.save()

            return JsonResponse({'code':'200','data': filter.id}, status=200)
        else:
            return JsonResponse({'code':'400','errors':valid_ser.errors}, status=400)

当我在正文中发送以下数据时,它起作用并保存了对象:

{
    "data": {
        "http://example.org/about": {
            "http://purl.org/dc/terms/title": [
                {
                    "type": "literal",
                    "value": "Anna's Homepage"
                }
            ]
        }
    }
}

但是当我将数据作为字符串(不是 json 对象)发送时,它仍然保存,我该如何防止这种情况?

{
    "data" : "abc"
}

标签: pythondjangovalidationserializationdjango-rest-framework

解决方案


推荐阅读