I have a client model that can have multiple numbers like a person can have multiple phone numbers. I want to create a client in my database plus add all of its phone numbers at the same time. just like when a person submits his data in a form.
Right now I testing my API in postman but could submit data when number field is added in serializer, GET request is working but I am struggling with post
models.py
class Client(models.Model):
name = models.CharField(max_length=32)
departure = models.DateTimeField(default=None, blank=True)
arrival = models.DateTimeField(default=None, blank=True)
price = models.IntegerField(validators=[MinValueValidator(0)])
def __str__(self):
return self.name
class Number(models.Model):
number = models.IntegerField()
client = models.ForeignKey(Client, on_delete=models.CASCADE, null=True, related_name='number')
serializers.py
class NumberSerializer(serializers.ModelSerializer):
class Meta:
model = Number
fields = ('id', 'number')
class ClientSerializer(serializers.ModelSerializer):
number = NumberSerializer(many=True)
class Meta:
model = Client
fields = ('id', 'name', 'departure', 'arrival', 'price','number')
views.py
class ClientViewSet(viewsets.ModelViewSet):
queryset = Client.objects.all()
serializer_class = ClientSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
This is how I am making a post request via postman and getting error
I think you need to override the create
method to make writable nested serializer :
class NumberSerializer(serializers.ModelSerializer):
class Meta:
model = Number
fields = ('id', 'number')
class ClientSerializer(serializers.ModelSerializer):
number = NumberSerializer(many=True)
class Meta:
model = Client
fields = ('id', 'name', 'departure', 'arrival', 'price','number')
def create(self, validated_data):
number_data = validated_data.pop('number')
number = Number.objects.create(**number_data)
client = Client.objects.create(number=number, **validated_data)
return client
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.