Python Django中的JSONField即使在POST请求之后仍然保持为空

Python Django中的JSONField即使在POST请求之后仍然保持为空,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我有一个模型在Django有一个JSONField。如果我使用Django Rest UI通过浏览器发布POST,那么数据将毫无问题地输入到模型中。但是,当我在应用程序中使用Python的requests.post时,除了JSONField数据之外的所有数据都存储在模型中 这是我的模型 from django.db import models from django.contrib.postgres.fields import JSONField class Scans(models.Model

我有一个模型在Django有一个JSONField。如果我使用Django Rest UI通过浏览器发布POST,那么数据将毫无问题地输入到模型中。但是,当我在应用程序中使用Python的requests.post时,除了JSONField数据之外的所有数据都存储在模型中

这是我的模型

from django.db import models
from django.contrib.postgres.fields import JSONField
class Scans(models.Model):
    Name = models.CharField(max_length=20)
    Server = models.CharField(max_length=20)
    Results = JSONField(default=dict)
    Report_Url = models.URLField(max_length=30)`
这是我的序列化程序

from rest_framework import serializers 
from .models import Scans   
class ScansSerializer(serializers.ModelSerializer):
    class Meta:
        model = Scans
        fields = '__all__'
这是我的看法

class ScansData(APIView):
    def get(self, request):
        scans = Scans.objects.all()
        serializer = ScansSerializer(scans, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def post(self, request):
        serializer = ScansSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request):
        scans = Scans.objects.all()
        scans.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
这是我的要求

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Report_Url": "https://127.0.0.1:8000/about/"
}
jsonval = {
    "Results": {
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    }
}
requests.post('http://127.0.0.1:8000/scans/', data=data, json=jsonval)
网址

使用requests.post后看到的内容

{
    "id": 10,
    "Name": "dodo",
    "Server": "ubuntu",
    "Results": {},
    "Report_Url": "https://127.0.0.1:8000/about/"
}

尝试使用此格式的数据

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Report_Url": "https://127.0.0.1:8000/about/",
    "Results": json.dumps({
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    })
}
并删除jsonvalue

requests.post('http://127.0.0.1:8000/scans/', data=data)

尝试使用此格式的数据

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Report_Url": "https://127.0.0.1:8000/about/",
    "Results": json.dumps({
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    })
}
并删除jsonvalue

requests.post('http://127.0.0.1:8000/scans/', data=data)
数据={ “名称”:“渡渡鸟”, “服务器”:“ubuntu”, “报告Url”: “结果”:{ “严重程度高”:8, “严重性/中等”:7, “严重程度低”:5 } } 请求。post(“”,数据=数据)

数据={ “名称”:“渡渡鸟”, “服务器”:“ubuntu”, “报告Url”: “结果”:{ “严重程度高”:8, “严重性/中等”:7, “严重程度低”:5 } } 请求。post(“”,data=data)

尝试以下操作:

import json

jsonval = {
    "Results": {
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    }
}

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Report_Url": "https://127.0.0.1:8000/about/",
    "Results": jsonval["Results"]
}

requests.post('http://127.0.0.1:8000/scans/', data=json.dumps(data))
试试这个:

import json

jsonval = {
    "Results": {
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    }
}

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Report_Url": "https://127.0.0.1:8000/about/",
    "Results": jsonval["Results"]
}

requests.post('http://127.0.0.1:8000/scans/', data=json.dumps(data))

非常感谢Suh和Sachin!我终于能够解决这个问题了,原来json.dumps确实是关键。以下是我为解决这个问题所做的

jsonval = {
    "Results": {
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    }
}

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Results": json.dumps(jsonval["Results"]),
    "Report_Url": "https://127.0.0.1:8000/about/"
}
requests.post('http://127.0.0.1:8000/scans/', data=data)

非常感谢Suh和Sachin!我终于能够解决这个问题了,原来json.dumps确实是关键。以下是我为解决这个问题所做的

jsonval = {
    "Results": {
        "Severity_High": 8,
        "Severity_Medium": 7,
        "Severity_Low": 5
    }
}

data = {
    "Name": "dodo",
    "Server": "ubuntu",
    "Results": json.dumps(jsonval["Results"]),
    "Report_Url": "https://127.0.0.1:8000/about/"
}
requests.post('http://127.0.0.1:8000/scans/', data=data)

我尝试了这个,得到了状态400响应,数据库中没有任何存储。我尝试了这个,得到了状态400响应,数据库中没有任何存储。try requests.post(“”,data=json.dumps(data))try requests.post(“”,data=json.dumps(data))得到了状态415不支持的媒体类型。太好了,我已经更新了我的答案,请投票,如果它是有用的绝对!保存了我的一天。太好了,我已经更新了我的答案,请更新投票,如果它是有用的绝对!救了我一天。