Goba
Goba

Reputation: 4435

How to deserialize nested serializers with Django Rest Framework

i have in 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)

and

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)

and in 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

and my view

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)

i have this error

Got AttributeError when attempting to get a value for field options on serializer VariantsSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Variants instance. Original exception text was: 'Variants' object has no attribute 'options'.

but the data has already been validated by the call to is_valid()

why return Response(serializer.data) gives error ?

Upvotes: 1

Views: 642

Answers (1)

duddits
duddits

Reputation: 577

Try to change

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

with

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

Upvotes: 2

Related Questions