Django POST请求嵌套对象主键 [英] Django POST Request nested object primary key

查看:104
本文介绍了Django POST请求嵌套对象主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个关于带有序列化程序的Django中带有嵌套对象的POST请求的问题:

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

我已经检查过了:

我已按照以下架构在Django项目中创建了一些序列化器:

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

这是我的序列化文件:

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 :

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__'

这是我的观点:

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,但没有成功.

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.

邮递员请求:

{
    "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请求中运行,为什么?
  • 为了使调试更容易,我尝试了没有成功打印的情况来自序列化程序的变量,Postman响应中没有任何显示.有办法看到他们吗?

谢谢!

推荐答案

据我了解,AP模型具有字段

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'
]

然后

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

这篇关于Django POST请求嵌套对象主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆