Django Rest Framework создаваемые поля и обновляемые поля

Ниже приведен пример моей модели:

class DemoModel(models.Model):
    field_one = models.IntegerField()
    field_two = models.IntegerField(blank=True, null=True)

Сериализатор:

class DemoSerializer(serializers.ModelSerializer):
    """
    Here only field_one should be creatable and only field_two should be updatable
    """
    class Meta:
        model = models.DemoModel
        fields = '__all__'

Мой вопрос в том, как я могу написать представление для этого сериализатора и модели, чтобы при использовании метода post клиент не мог добавить данные для поля field_two. Клиент может добавлять данные только в field_one. Но при обновлении клиент может обновить значение field_two, но не может обновить значение поля field_one.

Спасибо

Вы можете создать 2 разные формы (с разными полями), и в вашем views.py отображать форму в зависимости от того, существует ли уже модель или нет.

Вы можете создать put метод для update значения, и post метод для create значения

from rest_framework.permissions import AllowAny
from rest_framework.views import APIView

class Demo_view(APIView):
    permission_classes = [AllowAny]
    # if field doesnt exist
    def post(self, request): 
        field_from_user=request.data["field_from_user"]
        target_object = DemoModel.objects.get(pk=1)
        #check if field one exist
        if target_object.field_one:
            #if it exists then return error
            return Response({'status':200, 'message':"field already exist"})
        #if it doesnt exist create it
        else:
            #logic with creation of the field
            target_object.field_one = "some value here"
            target_object.save()
            return Response({'status':200, 'message':"field created"})
            
    #if you want to update you need to use put method
    def put(self, request): 
        field_from_user=request.data["field_from_user"]
        target_object = DemoModel.objects.get(pk=1)
        #check if this field exist:
        if target_object.field_two:
            #if it is, so update it
            target_object.field_two = "new value"
            target_object.save()
        #if it doesnt exist then return error or smth
        else:
            return Response({'status':200, 'message':"field doesnt exist"})

Я достиг этого, переопределив метод create и update внутри сериализатора:

class DemoSerializer(serializers.ModelSerializer):
    """
    Serializer for DemoModel
    """
    class Meta:
        model = models.DemoModel
        fields = '__all__'

    def create(self, validated_data):
        """
        Overriding create method here to preventing some fields from getting created
        """
        validated_data.pop('field_two', None)  # prevent field_two from being created
        return super(LeaveRequestSerializer, self).create(validated_data)

    def update(self, instance, validated_data):
        """
        overriding update method here to preventing some fields from getting updated
        """
        validated_data.pop('field_one', None)  # prevent field_one from being updated
        return super(LeaveRequestSerializer, self).update(instance, validated_data)

Для представления я использовал простой genericview

Вернуться на верх