【问题标题】:Django POST Request nested object primary keyDjango POST 请求嵌套对象主键
【发布时间】:2020-06-19 04:06:39
【问题描述】:

我有一个关于 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,而只会获取用户对象本身。 正如您在 serializers_ap.py 中的 create 方法中看到的那样,我尝试了 3 种不同的方法来提取 ID,但均未成功。

邮递员请求:

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

邮递员回复:

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

因此我有 3 个问题:

  • 我是否缺少一些基本的东西来获取对象的 ID?
  • 在请求正文中提供用户主键的 PUT 请求 工作正常,但不能在 POST 请求中,为什么?
  • 为了让调试更容易,我尝试了打印但没有成功 来自序列化程序的变量,邮递员响应中没有显示任何内容。 有没有办法看到它们?

谢谢!

【问题讨论】:

    标签: python django serialization nested


    【解决方案1】:

    据我了解,AP模型有字段

    user = models.ForeignKey('User')
    

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

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

    然后只是

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

    【讨论】:

    • 感谢@marcustas 的回复,但它给了我另一个问题,我发布了here,如果你能看一下就好了:)
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2023-01-08
    • 2017-05-19
    • 1970-01-01
    • 2018-12-20
    • 2014-05-07
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多