1

I'm getting

{"franchise":["This field is required."]}

when I send POST request to localhost Django via

http://localhost:8000/api/franchise/charge/

I'm sending the following 2 fields as Postman's body

key: price       value: 1000
key: franchise   value: 1

URL

router.register(r'franchise/charge', views.FranchiseChargeViewSet)

View

class FranchiseChargeViewSet(viewsets.ModelViewSet):
    queryset = FranchiseCharge.objects.all()
    serializer_class = FranchiseChargeSerializer

    def get_permissions(self):
        permission_classes = []
        if self.action == 'create':
            permission_classes = [IsFranchise]
        elif self.action == 'retrieve':
            permission_classes = [IsFranchise]
        elif self.action == 'list':
            permission_classes = [IsFranchise]
        elif self.action == 'update' or self.action == 'partial_update':
            permission_classes = [IsFranchise]
        elif self.action == 'destroy':
            permission_classes = [IsFranchise]
        return [permission() for permission in permission_classes]

Model

class FranchiseCharge(models.Model):
    franchise = models.ForeignKey(Franchise,null=True,on_delete=models.SET_NULL, default=1)
    time = models.DateTimeField(default=timezone.now)
    price = models.PositiveIntegerField(default=0)

Serializer

class FranchiseChargeSerializer(RelationModelSerializer):
    franchise = FranchiseSerializer(is_relation=True)
    class Meta:
        model = FranchiseCharge
        fields = ('id','franchise','time','price')

    @transaction.atomic
    def create(self, validated_data):
        instance = FranchiseCharge.objects.create(**validated_data)
        return instance

What do I need to do to fix this?

Usman Maqbool
  • 3,351
  • 10
  • 31
  • 48
J.S.C
  • 1,323
  • 3
  • 16
  • 22

1 Answers1

1

You are using nested serializer, so the data for it should be nested json object in data.

As I see, you are using RelationModelSerializer - if it corresponds to the one described in linked article - it also suggests putting related model pk field name in nested json:

{
  "price": 1000,
  "franchise": {
    "id": 1
  }
}

For regular DRF nested serilizers - one option is to use different serializers for read and write. That way serializer for write can be configured without nested serializer, just accept franchise_id directly in franchise field.

Check this SO answer on nested serializers.

Oleg Russkin
  • 4,234
  • 1
  • 8
  • 20