Trouble with create function in django using rest framework

Viewed 30

I am a Flask developer using Django for a project I am working on... I am using rest framework in django because I am using firebase for auth and found some good advice on how to incorporate it using rest framework

Problem is when I try to create a supplier for a user, you can see the error response from Postman below...

Request to: http://localhost:8000/pm/createsupplier/3/

Request body:

{
    "supplier": {"name": "Donald Duck", "phone": 111, "email": "donald@yahoo.com"}
}

Request response:

  {
        "email": "kbess86@gmail.com"
  }

And the supplier is not created

models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    bio = models.CharField(max_length=200)
    email = models.CharField(max_length=200)

class Supplier(models.Model):
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    phone = models.IntegerField()
    email = models.EmailField()

views.py:

class createsuppliers(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = CreateSupplierSerializer
    lookup_field = 'user'

serializers.py:

class CreateSupplierSerializer(serializers.ModelSerializer):
    name = serializers.CharField(required=False, allow_blank=True, max_length=100)
    email = serializers.CharField(required=False, allow_blank=True, max_length=100)
    phone = serializers.IntegerField(required=False)

    def create(self, instance, validated_data):
        supplier_data = validated_data.pop('supplier')
        supplier = Supplier.objects.create(user=instance, **supplier_data)

        return supplier
    class Meta:
        model=Supplier
        fields=['name','email','phone']
1 Answers

The solution...

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    bio = models.CharField(max_length=200)
    email = models.CharField(max_length=200)

class Supplier(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    phone = models.IntegerField()
    email = models.EmailField(max_length=200)

views.py...

class createsuppliers(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = CreateSupplierSerializer
    lookup_field = 'user'

serializers.py...

class CreateSupplierSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=200)
    email = serializers.EmailField(max_length=200)
    phone = serializers.IntegerField()

    def update(self, instance, validated_data):
        if str(self.context['request'].user) != str(instance.user.username):
            raise exceptions.PermissionDenied('You do not have permission to update')
            
        supplier = Supplier.objects.create(user=instance, **validated_data)

        return supplier
    class Meta:
        model=Supplier
        fields=['name','email','phone']
Related