how to create model instance in drf serializers

Viewed 34

I am new to DRF. I want to get saved the model.

In models.py, PackageDetails and PhysicalDetail have foreignkey relationship to Member

My serializers.py is as follows:

from rest_framework import serializers
from .models import Member, PackageDetails, PhysicalDetail



class PackageDetailsSerializer(serializers.ModelSerializer):
    is_expired = serializers.SerializerMethodField()
    members_expiry_date = serializers.SerializerMethodField()


    class Meta:
        model = PackageDetails  
        exclude = ['id']
        extra_fields = ['is_expired', 'members_expiry_date']

    def get_is_expired(self, instance):
        return instance.is_expired


    def get_members_expiry_date(self, instance):
        return instance.members_expiry_date



class PhysicalDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = PhysicalDetail
        exclude = ['id']



class MemberSerializer(serializers.ModelSerializer):
    physical_details = PhysicalDetailSerializer(many=True)
    package_details = PackageDetailsSerializer(many=True)


    class Meta:
        model = Member
        fields = '__all__'
        extra_fields = ['physical_details', 'package_details']

    def create(self, validated_data):
        physical_detail_data = validated_data.pop("physical_details")
        package_detail_data = validated_data.pop("package_details")

        member = Member.objects.create(**validated_data)
        PhysicalDetail.objects.create(member=member, **physical_detail_data)
        PackageDetails.objects.create(member=member, **package_detail_data)
        return member

views.py :

class MemberViewset(viewsets.ModelViewSet):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

class PackageDetailViewset(viewsets.ModelViewSet):
    queryset = PackageDetails.objects.all()
    serializer_class = PackageDetailsSerializer


class PhysicalDetailViewset(viewsets.ModelViewSet):
    queryset = PhysicalDetail.objects.all()
    serializer_class = PhysicalDetailSerializer

In GET request it worked well.. but in POST request with the same json format it responses the following:

{
"physical_details": [
    "This field is required."
],
"package_details": [
    "This field is required."
]
}

I've provided the fields.. so why this happening..

1 Answers

You removed those from dict using pop()

The pop() method removes and returns an element from a dictionary having the given key.

Try using get() instead

The get() method returns the value for the specified key if the key is in the dictionary.

Related