Как создать экземпляр модели в сериализаторах drf
Я новичок в DRF. Я хочу получить сохраненную модель ... Заранее спасибо.
В models.py, PackageDetails и PhysicalDetail имеют отношение foreignkey к Member
мой serializers.py выглядит следующим образом
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
В GET запросе все работает хорошо... но в POST запросе с тем же форматом json он отвечает следующее:
{
"physical_details": [
"This field is required."
],
"package_details": [
"This field is required."
]
}
Я предоставил поля. так почему это происходит...
Вы удалили их из диктанта, используя pop()
Метод pop() удаляет и возвращает элемент из словаря с заданным ключом.
Попробуйте использовать get()
вместо
Метод get() возвращает значение для указанного ключа, если ключ находится в словаре.