django rest framework post nested json

Viewed 125

I have a table on sqlserver

ext_id is number,
dealer_code is string,
dealer_name is string

and I need to POST this json

{
    "ext_id": 1,
    "dealer": {
        "dealer_code" : "D1"
        "dealer_name": "Dealer1",
    }
}

models.py

class reqid(models.Model):
    ext_id = models.IntegerField(primary_key=True)
    dealer_code = models.CharField(max_length=10, db_column="dealer_code")
    dealer_name = models.CharField(max_length=30, db_column="dealer_name")
    class Meta:
        db_table = 'table_test'

    def __str__(self):
        return self.ext_id

serializer.py

class ReqSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = reqid
        fields = ['ext_id', 'dealer_code','dealer_name']

views.py

class testView(viewsets.ModelViewSet):
    queryset = reqid.objects.all()
    serializer_class = ReqSerializer

    def post(self, request, format=None):
        reqid = request.data.get("reqid")
        dealer_code = request.data['dealer']['dealer_code']
        dealer_name = request.data['dealer']['dealer_name']
        data = {'reqid': reqid, 'dealer_code': dealer_code, 'dealer_name': dealer_name}
        serializer = ReqSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

when I try post json i get

HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "detail": "JSON parse error - Expecting ',' delimiter: line 5 column 3 (char 60)"
}

if I post simple json like :

{
    "ext_id": 1,
    "dealer_code": "D1",
    "dealer_name": "Dealer1"
}

everything works. What and where should I change to load nested json.

I am a beginner so please be specific :)

UPDATE

Thx @Vishal Singh

Right now I must add more nest "asset"

....

"dealer":{
      "dealer_code":"D1",
      "dealer_name":"Dealer1",
   },
   "asset":{
      "sector":{
         "code":"SEC1",
         "name":"Sector1"
      }
   }

...

how can I save sector name (I added column to database)?

When I add to views.py

sector_name = request.data['asset']['sector']['name']

and in serialize.py

class SectorField(serializers.Field):

    def to_representation(self, value):
        ret = {
            "sector_name": value.sector_name
        }
        return ret

    def to_internal_value(self, data):
        ret = {
            "sector_name": data["name"],
        }
        return ret

I get

HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "sector": [
        "This field is required."
    ]
}
0 Answers
Related