Django POST Запрос первичного ключа вложенного объекта - PullRequest
1 голос
/ 06 марта 2020

У меня есть вопрос относительно 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 ничего не отображалось. Есть ли способ их увидеть?

Спасибо!

1 Ответ

1 голос
/ 06 марта 2020

Как я понял, модель AP имеет поле

user = models.ForeignKey('User')

Если да, то вы можете попробовать изменить поля в сериализаторе на

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

, а затем просто

ap = AP.objects.create(**validated_data)
return ap
...