【发布时间】: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