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



我在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)

URL

urlpatterns = [    
path('scans/', ScansData.as_view()),
]

使用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={"姓名":"渡渡鸟","服务器":"ubuntu","Report_Url":"https://127.0.0.1:8000/about/"结果":{"Severity_High":8,"Severity_Mediaum":7,"Severity_Low":5}}requests.post('http://127.0.0.1:8000/scans/',数据=数据(

非常感谢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)

试试这个:

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))

最新更新