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