1

I have a question regarding POST request with nested objects in Django with serializers:

I have checked this:

I've created some serializers in my Django project following the architecture below:

EP_project
│
│
└───ep_python
    │   db.sqlite3
    │   manage.py
    │   __init__.py
    │
    ├───ep
    │   │   admin.py
    │   │   apps.py
    │   │   models.py
    │   │   tests.py
    │   │   urls.py
    │   │   __init__.py
    │   │
    │   ├───migrations
    │   │
    │   ├───models
    │   │   │   model_aa.py
    │   │   │   model_ap.py
    │   │   │   model_apr.py
    │   │   │   model_as.py
    │   │   │   model_at.py
    │   │   │   model_b.py
    │   │   │   model_be.py
    │   │   │   model_se.py
    │   │   │   model_s.py
    │   │   │   model_user.py
    │   │   │   __init__.py
    │   │
    │   ├───serializers
    │   │   │   serializers_ap.py
    │   │   │   serializers_user.py
    │   │   │   __init__.py
    │   │
    │   ├───views
    │       │   views_a.py
    │       │   views_user.py
    │
    ├───ep_python
        │   asgi.py
        │   settings.py
        │   urls.py
        │   wsgi.py
        │   __init__.py

Here are my serializers files:

serializers_user.py:

from rest_framework import serializers
from ..models.model_user import User


class UserIndexSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [
            'first_name',
            'last_name'
        ]

class UserDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

I tried to create a custom create method in my next serializer: serializers_ap.py:

from rest_framework import serializers
from ..models.model_ap import AP
from .serializers_user import *


class APIndexSerializer(serializers.ModelSerializer):
    # user = UserIndexSerializer()

    class Meta:
        model = AP
        fields = [
            'id',
            'user',
            'name'
        ]

    def create(self, validated_data):
        user = User.objects.get(pk=validated_data).id
        # user = User.objects.only('id').get(pk=validated_data)
        # user_id = user["id"]
        # user = User.objects.filter(pk=validated_data).pop("id")
        # instance = Equipment.objects.create(**validated_data)
        ap = AP.objects.create(User=user_id, **validated_data)
        return ap

class APDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = AP
        fields = '__all__'

And here are my views:

views_a.py:

from rest_framework import generics
from ..models.model_ap import AP
from ..serializers.serializers_ap import (
    APIndexSerializer,
    APDetailsSerializer
    )


class APIndex(generics.ListCreateAPIView):
    """List all ap, or create a new ap."""

    queryset = AP.objects.all().order_by('name')
    serializer_class = APIndexSerializer


class APDetails(generics.RetrieveUpdateDestroyAPIView):
    """Retrieve, update or delete an ap instance."""

    queryset = AP.objects.all()
    serializer_class = APDetailsSerializer

views_user.py:

from rest_framework import generics
from ..models.model_user import User
from ..serializers.serializers_user import (
    UserIndexSerializer,
    UserDetailsSerializer
    )


class UserIndex(generics.ListCreateAPIView):
    """List all users, or create a new user."""

    queryset = User.objects.all().order_by('first_name')
    serializer_class = UserIndexSerializer


class UserDetails(generics.RetrieveUpdateDestroyAPIView):
    """Retrieve, update or delete a user instance."""

    queryset = User.objects.all()
    serializer_class = UserDetailsSerializer

The problem is that when I'm posting an AP via postman, it won't get the User ID but only the User object itself. As you can see in my create method in serializers_ap.py, I have tried 3 different ways to extract the ID but with no success.

Postman request:

{
    "user":1,
    "name":"Max AP 01"
}

Postman response:

Field 'id' expected a number but got {'user': <User: Se Po>, 'name': 'Max AP 01'}.

I therefore have 3 questions:

  • Is there something basic I'm missing to get an object's ID?
  • A PUT request providing the User primary key in the request body works fine but not in a POST request, why?
  • To try and make debugging easier I have tried without succes to print variables from the serializer, nothing showed up in Postman response. Is there a way to see them?

Thanks!

MaxenceP
  • 291
  • 2
  • 12

1 Answers1

1

As I understood, AP model has field

user = models.ForeignKey('User')

If yes, then you can try to change fields in serializer to

fields = [
    'user_id', #or just 'user'
    'name'
]

and then just

ap = AP.objects.create(**validated_data)
return ap
marcustas
  • 46
  • 3
  • Thanks @marcustas for your response, but it gave me another problem that i posted [here](https://stackoverflow.com/questions/60600453/django-nested-objects-different-serializers-get-and-post), it would be nice if you could have a look at it :) – MaxenceP Mar 09 '20 at 12:22