gpt4 book ai didi

python - 在 Serializer DRF 中添加非模型字段

转载 作者:太空宇宙 更新时间:2023-11-03 11:41:17 33 4
gpt4 key购买 nike

我正在尝试将栅格模型字段与非模型 config_version 字段组合到我的序列化程序中,如下所示:

class RasterPostSerializer(serializers.ModelSerializer):

class Meta:
model = Raster
fields = (
'name',
'description',
'filepath'
)


class ConfigurationSerializer(serializers.Serializer):
config_version = serializers.CharField()
rasters = RasterPostSerializer(many=True)

def create(self, validated_data):
data_field = validated_data['rasters']
for raster in data_field['rasters']:
return Raster(name=raster['name'], description=raster['description'], filepath=raster['filepath'])

在使用 serializer.save() 方法之前,我想在我的 view.py 中检查 config_version,但之后 .save() 给我:

The serializer field might be named incorrectly and not match any attribute or key on the `Raster` instance.
Original exception text was: 'Raster' object has no attribute 'config_version'.

这是怎么回事,是否有解决方案?

编辑:我的示例 JSON POST 负载如下所示:

{
"config_version":"v2",
"rasters":[
{
"name":"XYZ.jpg",
"description":"some description",
"filepath":"path in filesystem"
}
}

config_version 不是常量。它可以动态设置,因为使用 ConfigurationSerializer 的 Controller 将是配置端点 - 将来可能需要添加栅格和其他一些信息。

views.py 中的配置端点看起来像

@api_view(['POST'])
def configuration(request):

if request.method == 'POST':
serializer = ConfigurationSerializer(data=request.data)

if serializer.is_valid():
if serializer.validated_data['config_version'] is 'v2':

raster_name_list = [raster.name for raster in Raster.objects.all()]
for instance in serializer.validated_data['rasters']:
if instance['name'] in raster_name_list:
return Response({"Fail": "Raster name '{}' already exists".format(instance['name'])}, status=status.HTTP_304_NOT_MODIFIED)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

最佳答案

您应该返回 ConfigurationSerializer 数据作为创建操作的结果。而且我也不知道你要用 config_version

做什么
class ConfigurationSerializer(serializers.Serializer):
config_version = serializers.CharField()
rasters = RasterPostSerializer(many=True)

def create(self, validated_data):
config_version = validated_data.get('rasters')
rasters = validated_data.pop('rasters')
raster_list = []
for raster in rasters:
raster_list.append(Raster.objects.create(**raster))
return {
"config_version": config_version,
"rasters": raster_list
}

关于python - 在 Serializer DRF 中添加非模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48884153/

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