У меня есть вопрос относительно POST-запроса с вложенными объектами в Django с сериализаторами:
Я проверил это:
Я создал несколько сериализаторов в своем Django проект в соответствии с приведенной ниже архитектурой:
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
Вот мои файлы сериализаторов:
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__'
Я пытался создать собственный метод создания в мой следующий сериализатор: 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__'
А вот мои взгляды:
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
Проблема в том, что когда я отправляю AP через почтальона, он не получает идентификатор пользователя, а только сам объект User. Как вы можете видеть в моем методе создания в serializers_ap.py
, я пробовал 3 различных способа извлечь идентификатор, но безуспешно.
Запрос почтальона:
{
"user":1,
"name":"Max AP 01"
}
Ответ почтальона:
Field 'id' expected a number but got {'user': <User: Se Po>, 'name': 'Max AP 01'}.
Поэтому у меня есть 3 вопроса:
- Есть ли что-то базовое c Мне не хватает, чтобы получить идентификатор объекта?
- Предоставление запроса PUT первичный ключ пользователя в теле запроса работает нормально, но не в запросе POST, почему?
- Чтобы попытаться упростить отладку, я попытался без успеха напечатать переменные из сериализатора, но в ответе Postman ничего не отображалось. Есть ли способ их увидеть?
Спасибо!