首页 > 解决方案 > Django POST 请求嵌套对象主键

问题描述

我对带有序列化程序的 Django 中嵌套对象的 POST 请求有疑问:

我已经检查过了:

我按照以下架构在我的 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 时,它不会获得用户 ID,而只会获得用户对象本身。正如您在我的 create 方法中看到的那样serializers_ap.py,我尝试了 3 种不同的方法来提取 ID,但都没有成功。

邮递员要求:

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

邮递员回复:

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

因此,我有 3 个问题:

谢谢!

标签: pythondjangoserializationnested

解决方案


据我了解,AP模型有字段

user = models.ForeignKey('User')

如果是,那么您可以尝试将序列化程序中的字段更改为

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

然后就

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

推荐阅读