ラスターモデルフィールドと非モデル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を利用するコントローラーが構成エンドポイントになるため、動的に設定できます。将来、ラスターやその他の情報を追加する可能性があります。
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
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加