【问题标题】:How to deserialize nested serializers with Django Rest Framework如何使用 Django Rest Framework 反序列化嵌套的序列化程序
【发布时间】:2018-07-04 00:44:08
【问题描述】:

我在models.py中有

class Variants(Model):
    class Meta:
        db_table = 'variants'

        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=255, blank=False, null=False)
        client = models.ForeignKey(Client, on_delete=models.CASCADE, null=False, blank=False)
        created_at = models.DateField(auto_created=True, default=now, blank=True)
        updated_at = models.DateField(auto_now=True, null=True, blank=True)

class VariantOptions(Model):
    class Meta:
        db_table = 'variant_options'

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False, null=False)
    variant = models.ForeignKey(Variants, on_delete=models.CASCADE, null=False, blank=False)
    created_at = models.DateField(auto_created=True, default=now, blank=True)
    updated_at = models.DateField(auto_now=True, null=True, blank=True)

在 serializers.py 中

class VariantOptionsSerializer(serializers.ModelSerializer):
class Meta:
    model = models.VariantOptions
    fields = ['name']

class VariantsSerializer(serializers.ModelSerializer):
    options = VariantOptionsSerializer(many=True)

class Meta:
    model = models.Variants
    fields = ['name','client','options']

def create(self, validated_data):
    options_data = validated_data.pop('options')
    variant = models.Variants.objects.create(**validated_data)
    for option_data in options_data:
        models.VariantOptions.objects.create(variant=variant, **option_data)
    return variant

我的看法

class VariantsCreate(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = serializers.VariantsSerializer
    def post(self, request, format=None):
        serializer = serializers.VariantsSerializer(data=request.data)
        if serializer.is_valid():
            saved = serializer.save()
            return Response(serializer.data) ==> serializer.data gives error
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我有这个错误

尝试在序列化程序 VariantsSerializer 上获取字段 options 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Variants 实例上的任何属性或键都不匹配。 原始异常文本是:“Variants”对象没有“选项”属性。

但数据已通过调用 is_valid() 进行验证

为什么return Response(serializer.data) 报错?

【问题讨论】:

    标签: python json django serialization django-rest-framework


    【解决方案1】:

    尝试改变

    variant = models.ForeignKey(Variants, on_delete=models.CASCADE, null=False, blank=False)

    variant = models.ForeignKey(Variants, related_name='options', on_delete=models.CASCADE, null=False, blank=False)

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2016-02-09
      • 2018-07-06
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多