I have multiple choice nested serializer, I am able to get the value but during patch call subjects not getting updated
Here User and Subject are two models,
**Model.py**
class Subject(models.Model):
uid = models.AutoField(verbose_name='ID',
serialize=False,
auto_created=True,
primary_key=True)
ENG = "ENGLISH"
HND = "HINDI"
SUBJECT = (
(ENG, "English"),
(HND, "Hindi"),
)
subject = models.CharField(
max_length=50, choices=SUBJECT, default=ENG)
def __str__(self):
return self.subject
class User(AbstractUser):
uid = models.AutoField(verbose_name='ID',
serialize=False,
auto_created=True,
primary_key=True)
TEACHER = "Teacher"
STUDENT = "Student"
user_type = models.CharField(max_length=30, default=STUDENT)
approved = models.BooleanField(default=True)
def save(self, *args, **kwargs):
if self.user_type == User.TEACHER and self._state.adding:
self.approved = False
super().save(*args, **kwargs)
@property
def syllabus(self):
ret = self.teacher.syllabus_set.all()
if ret:
return ret
else:
return ''
Here is my serializer call
**serializers.py**
class TeacherProfileDetails(serializers.ModelSerializer):
logger = logging.getLogger(__name__)
teacher_date = AvailabilityDetails(many=True, read_only=True)
first_name = serializers.CharField(source='user.first_name', read_only=True)
last_name = serializers.CharField(source='user.last_name', read_only=True)
cities = CitySerializer(many=True, read_only=True)
subject = serializers.SerializerMethodField()
user = UserDetailsSerializer(read_only=True)
class Meta:
model = Teacher
fields = ('user', 'first_name', 'last_name',
'bio', 'teacher_cost', 'subject', 'teacher_date', 'cities')
def get_subject(self, obj):
subject_list = []
for i in obj.subject.all():
subject_list.append(i.subject)
return subject_list
Here is my views.py call
**views.py**
class TeacherListCreateAPIView(APIView):
logger = logging.getLogger(__name__)
#def create(self, request, *args, **kwargs):
def get(self, request, *args, **kwargs):
self.logger.info("Geeting TeacherListCreateAPIView information")
teacherList = Teacher.objects.filter(user__username=kwargs["username"])
self.logger.info(teacherList)
serializers = TeacherProfileDetails(teacherList, many=True)
self.logger.info(serializers.data)
return Response(serializers.data)
def patch(self, request, *args, **kwargs):
teacher = Teacher.objects.get(user__username=kwargs['username'])
serializers = TeacherProfileDetails(data=request.data, instance=teacher)
self.logger.info(serializers)
if serializers.is_valid():
serializers.save()
return Response(serializers.data, status=status.HTTP_201_CREATED)
return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)
Here is urls.py
path('teacher/<str:username>/details',
TeacherListCreateAPIView.as_view(), name="teacher-details"),
Issue :
I am able to get the teacher details, but patch call not updating subject, looks like I am doing some mistake in TeacherProfileDetails while serializing subject