gpt4 book ai didi

django - 无法在 Django Rest Framework 序列化程序的 valid_data 中获取非模型字段

转载 作者:行者123 更新时间:2023-12-01 23:18:26 24 4
gpt4 key购买 nike

我的 Django 模型中有一个 ItemCollection 和 Items,我希望能够通过 UI 从集合中删除 Items。在 REST PUT 请求中,我为每个项目添加一个额外的 bool 字段 deleted 来表示应删除项目。

处理这个问题的正确方法似乎是在序列化器的 update 方法中。我的问题是这个非模型 deleted 字段在验证期间被删除,因此它不再可用。添加 deleted 作为 SerializerMethodField 没有帮助。现在,我从序列化程序的 initial_data 属性中获取了我的deleted 信息,但这感觉不对。

我当前的示例代码如下。有人知道更好的方法吗?

型号:

    class ItemCollection(models.Model):
description = models.CharField(max_length=256)


class Item(models.Model):
collection = models.ForeignKey(ItemCollection, related_name="items")

序列化器:

    from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from models import Item, ItemCollection


class ItemSerializer(serializers.ModelSerializer):

class Meta:
model = Item


class ItemCollectionSerializer(serializers.ModelSerializer):

items = ItemSerializer(many=True, read_only=False)

class Meta:
model = ItemCollection

def update(self, instance, validated_data):
instance.description = validated_data['description']
for item, item_obj in zip(
self.initial_data['items'], validated_data['items']):
if item['delete']:
instance.items.filter(id=item['id']).delete()
return instance


class ItemCollectionView(APIView):

def get(self, request, ic_id):
item_collection = get_object_or_404(ItemCollection, pk=ic_id)
serialized = ItemCollectionSerializer(item_collection).data
return Response(serialized)

def put(self, request, ic_id):
item_collection = get_object_or_404(ItemCollection, pk=ic_id)
serializer = ItemCollectionSerializer(
item_collection, data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)

PUT 请求中的 json 示例:

    {
"id": 2,
"items": [
{
"id": 3,
"collection": 2,
"delete": true
}
],
"description": "mycoll"
}

最佳答案

您可以通过覆盖 to_internal_value fn 来添加非模型字段:

def to_internal_value(self, data):
internal_value = super(MySerializer, self).to_internal_value(data)
my_non_model_field_raw_value = data.get("my_non_model_field")
my_non_model_field_value = ConvertRawValueInSomeCleverWay(my_non_model_field_raw_value)
internal_value.update({
"my_non_model_field": my_non_model_field_value
})
return internal_value

然后您可以在创建更新中按照您想要的方式处理它。

关于django - 无法在 Django Rest Framework 序列化程序的 valid_data 中获取非模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30665220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com