python - 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 个问题:
- 获取对象的 ID 是否缺少一些基本的东西?
- 在请求正文中提供用户主键的 PUT 请求可以正常工作,但在 POST 请求中却不行,为什么?
- 为了尝试使调试更容易,我尝试从序列化程序打印变量但没有成功,Postman 响应中没有任何显示。有没有办法看到它们?
谢谢!
解决方案
据我了解,AP模型有字段
user = models.ForeignKey('User')
如果是,那么您可以尝试将序列化程序中的字段更改为
fields = [
'user_id', #or just 'user'
'name'
]
然后就
ap = AP.objects.create(**validated_data)
return ap
推荐阅读
- python-3.x - 为什么不在 Python 中显示我的图像根目录?
- javascript - 关于 AWS Lambda RDS + dynamoDB 在同一个函数中查询的基本 JS 问题
- java - java - 如何在java中将字符串从字符串中的一个特定单词拆分为同一字符串中的另一个特定单词?
- python - print() IndentationError: python 语言
- currency - 欧洲央行对欧元的官方美元汇率
- node.js - 在nodejs中使用(mocha,chai)进行错误单元测试
- entity-framework-6 - Enable-Migrations 命令导致 Entity Framework 6.4.0 出错
- ruby - RSpec 匹配来自 VCR 的哈希数组
- css - 如何实现这种悬停效果?
- alexa - 我将哪种 Amazon Alexa 插槽/意图类型用于常规字符串?