django - Django REST框架嵌套序列化程序中的“此字段是必需的”
问题描述
我有 2 个序列化程序,
class AssetTypeChoiceSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = AssetTypeChoice
fields = ["id", "probe", "choice", "choice_name"]
read_only_fields = ("probe",)
和一个父序列化器
class ProbeSerializer(serializers.ModelSerializer):
asset_type_choices = AssetTypeChoiceSerializer(many=True)
class Meta:
model = Probe
fields = [
"id",
"city",
"street",
"neighborhood",
"rooms_from",
"rooms_to",
"price_from",
"price_to",
"asset_type_choices",
]
def create(self, validated_data):
asset_type_choices = validated_data.pop("asset_type_choices")
probe = Probe.objects.create(**validated_data)
for choice in asset_type_choices:
AssetTypeChoice.objects.create(**choice, probe=probe)
return probe
每次我发布以创建新探针时,我都会遇到错误
{ "asset_type_choices": [ "此字段为必填项。" ] }
当我删除 AssetTypeChoiceSerializer 并尝试发布时,我成功创建了一个新探针。
这是我发帖时的原始内容:
{
"city": "test",
"street": "",
"neighborhood": "",
"rooms_from": 0,
"rooms_to": 0,
"price_from": 0,
"price_to": 0,
"asset_type_choices": [
{"id": 1, "choice": 1, "choice_name": "All"},
{"id": 2, "choice": 1, "choice_name": "All"},
],
}
我究竟做错了什么?
解决方案
所以问题是当我将我的使用从纯 django 更改为 django rest 框架时。我的观点是返回 request.data 而不是 serializer.data:
这是我之前的代码:
def probe_list(request):
if not request.user.is_authenticated:
return Response({"Error": "User must be logged in"}, status=status.HTTP_401_UNAUTHORIZED)
if request.method == 'GET':
qs = Probe.objects.all()
serializer = ProbeSerializer(qs, many=True)
return Response(request.data, status=status.HTTP_200_OK)
if request.method == 'POST':
serializer = ProbeSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save(user=request.user)
return Response(request.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这是我的代码之后:
def probe_list(request):
if not request.user.is_authenticated:
return Response({"Error": "User must be logged in"}, status=status.HTTP_401_UNAUTHORIZED)
if request.method == 'GET':
qs = Probe.objects.all()
serializer = ProbeSerializer(qs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
if request.method == 'POST':
serializer = ProbeSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save(user=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
一个新手错误,但仍然是一个错误。
推荐阅读
- javascript - 未经检查的 runtime.lastError:无法访问 url "" 的内容。扩展清单必须请求访问此主机的权限。在清单 3
- pine-script - 了解这行代码中的nz函数
- node.js - NodeJS writeFileSync “data”参数必须是字符串类型或 Buffer、TypedArray 或 DataView 的实例。收到一个对象实例
- php - 调用上下文中缺少 Codeigniter PHP SoapClient 端点名称(poolAlias)
- javascript - 如何在php中提交之前在另一个模态中预览模态的输入表单
- data-structures - 在 Pascal 中搜索多级链表
- c++ - Arduino 使用 nrf24l01 模块接收无意义
- azure - 如何为 CORS 配置 Azure API 管理
- java - 动态创建不同的请求对象
- javascript - Redux-persist 正在返回初始状态而不是持久化