Let's assume that I have in my POST method three fields - field1
, field2
, field3
however in POST method field2
and field3
should have the same value during adding to the database. So there is no need to add for instance field2=2
, field3=2
manually. I could add only field1=1
, field2=2
and then field3=2
will be added to this body automatically and finally whole 3 fields will be added to the database. I wonder how it should be done in most optimal way? Should it be done in view? I try in the way shown below.
views.py:
class UserObject(GenericAPIView):
def get_serializer_class(self, *args, **kwargs):
if self.request.method == 'POST':
return ObjectPostSerializer
return ObjectSerializer
def post(self, request, user_id):
serializer = ObjectPostSerializer(data=request.data)
if serializer.is_valid():
serializer.save(user_id=user_id)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py:
class ObjectPostSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(ObjectPostSerializer, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields['field3'].required = False
class Meta:
model=Object
field3 = model.field2
fields = ('__all__')
May be you can use simple logic, exclude field3
from post serializer, and set it on save
method of model
in serializer:
class ObjectPostSerializer(serializers.ModelSerializer):
class Meta:
model=Object
exclude = ('field3', )
in models:
class Object(model.Model):
# YOU FIELDS DECLARE HERE
def save(self, *args, **kwargs):
if not self.pk:
self.field3 = self.field2
super(Object, self).save(*args, **kwargs)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.