JSONField в Django продолжает оставаться пустым даже после запроса POST - PullRequest
1 голос
/ 08 мая 2020

У меня есть модель с JSONField в Django. Если я выполняю POST через браузер с использованием Django Rest UI, данные вводятся в модель без проблем. Однако, когда я использую Python request.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()),
]

Что я вижу после использования request.post

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

Ответы [ 4 ]

0 голосов
/ 08 мая 2020

Большое спасибо, Сух и Сачин! Я наконец смог разобраться. Оказалось, что 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)
0 голосов
/ 08 мая 2020

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

0 голосов
/ 08 мая 2020

Попробуйте это:

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))
0 голосов
/ 08 мая 2020

попробуйте данные в этом формате.

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