Mirza715
Mirza715

Reputation: 420

Related field id in POST request in Django Rest Framework

I am creating the object with just only related field id. I have searched a lot but couldn't get the answer. Here is my code

models.py:

class Resturant(models.Model):
    name = models.CharField(_('name'), max_length=100)

class Menu(models.Model):
    resturant_id = models.OneToOneField(Resturant, related_name='resturant', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)

serializers.py:

class MenuSerializer(serializers.ModelSerializer):
    resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Menu
        fields = ['id', 'created_at', 'resturant_id']

views.py:

class CreateMenuAPIView(APIView):

    def post(self, request, *args, **kwargs):
        serializer = MenuSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(status=status.HTTP_400_BAD_REQUEST)

I am getting this error while sending { "resturant_id": 2 } in POST request.

DETAIL:  Failing row contains (14, 2018-04-02 09:36:43.261849+00, null).
The above exception (null value in column "resturant_id" violates not-null constraint

Any help would be appreciated !

Upvotes: 0

Views: 5913

Answers (4)

blacker
blacker

Reputation: 798

you can override method create for find Restaurant object or create if not exist. and only edit serializer.

serializer.py

  class MenuSerializer(serializers.ModelSerializer):
      resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

      class Meta:
          model = Menu
          fields = ['id', 'created_at', 'resturant_id']

      def create(self, validated_data):
        id_param = validated_data.pop('resturant_id')
        resturant = Resturant.objects.get_or_create(id=id_param)[0]
        menu = Menu.objtects.create(resturant_id=resturant.id)
        return menu

if not work you can delete this line:

resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

Upvotes: 4

anjaneyulubatta505
anjaneyulubatta505

Reputation: 11665

try to change the serializer to

class MenuSerializer(serializers.ModelSerializer):
    resturant_id = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Menu
        fields = ['id', 'created_at', 'resturant_id']

if read_only=True then it will not write into database.

Upvotes: 0

Jibin Mathews
Jibin Mathews

Reputation: 1135

You are using a model serializer and have overridden 'returant_id'.

class MenuSerializer(serializers.ModelSerializer):
    returant_id = serializers.PrimaryKeyRelatedField(queryset=Resturant.objects.all())

Upvotes: 0

mjeffin
mjeffin

Reputation: 1

returant_id = serializers.PrimaryKeyRelatedField(read_only=True)

Could you try giving read_only=False

Could you check the spelling, returant_id is used in serializers field,'s' is missing. 'resturant_id' is used in fields list

Upvotes: 0

Related Questions