#django #django-rest-framework
Вопрос:
моя модель
class QuestionModel(models.Model):
question = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
doubt_class_id = models.ForeignKey(DoubtClasses, on_delete=models.CASCADE, null=True, blank=True)
conceptual_class_id = models.ForeignKey(LiveClass_details, on_delete=models.CASCADE, null=True, blank=True)
mentor = models.ForeignKey(Mentor, on_delete=models.CASCADE, null=True, blank=True)
answer = models.TextField(default='')
Я создал поле ответа для редактирования только суперпользователем с помощью администратора вопросов
класс QuestionAdmin(администратор.Администратор модели):
readonly_fields = ['answer']
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return []
else:
return self.readonly_fields
admin.site.register(QuestionModel, QuestionAdmin)
мой views.py
def put(self, request, type_of_class=None,pk=None):
if int(request.data.get('author')) != self.request.user.id:
return Response("you cannot edit othe user question", status=status.HTTP_405_METHOD_NOT_ALLOWED)
if pk:
question_id = models.QuestionModel.objects.filter(id=pk).first()
#if answer originally exists
if len(question_id.answer) > 0:
self.update(request, type_of_class, pk)
#this means answer is just updated
if len(question_id.answer) > 0 :
return Response("Successfully updated answer", status=status.HTTP_200_OK)
# this means that answer is deleted so decrease doubt address count
else:
if type_of_class =='doubtclass':
class_id = question_id.doubt_class_id
elif type_of_class == 'liveclass':
class_id = question_id.conceptual_class_id
class_id.doubtsAddressed -= 1
class_id.save()
return Response("Successfully deleted answer", status=status.HTTP_200_OK)
#if answer is not originally there
self.update(request, type_of_class, pk)
#this means that a student has updated his answer
if question_id.answer == '':
return Response("successfully updated a question", status=status.HTTP_200_OK)
#this means that a mentor has posted a answer
if type_of_class =='doubtclass':
print("type_of_class =='doubtclass'")
class_id = question_id.doubt_class_id
elif type_of_class == 'liveclass':
print("type_of_class =='conceptual_class'")
class_id = question_id.conceptual_class_id
print(class_id)
class_id.doubtsAddressed = 1
class_id.save()
return Response("Successfully posted answer", status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
мой urls.py
path('questions/<str:type_of_class>/<int:pk>/',views.QuestionModelViewID.as_view()),
моя логика
В запросе put студент может опубликовать вопрос , но не может обновить поле ответа, поэтому я проверяю, равна ли длина ответа 0 или не 0, если во время запроса put длина ответа равна 0, а после этого не равна нулю, это означает, что наставник опубликовал ответ, сделайте что-нибудь, иначе студент обновил свой вопрос. Если во время запроса put длина ответа на запрос не равна нулю, а после нее равна 0, то наставник удалил этот ответ или его длина изменилась, то Наставник только что обновил ответ
my error
I am currently a superuser, if originally answer length is 0 then it is working fine else it is not updating the answer field while making put request