【发布时间】:2021-06-24 11:26:14
【问题描述】:
我确实搜索了类似的问题,但没有解决我的问题的答案
我想要一个功能,比如一个问题可以有多个答案
我的模型.py
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)
conceptual_class_id = models.ForeignKey(LiveClass_details, on_delete=models.CASCADE, null=True, blank=True)
status = models.BooleanField(default=False)
mentor = models.ForeignKey(Mentor, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.question
def clean(self):
if self.doubt_class_id and self.conceptual_class_id :
raise ValidationError("only one field can be set")
class AnswersModel(models.Model):
answer = models.TextField()
question_id = models.ForeignKey(QuestionModel, on_delete=models.CASCADE)
我的 urls.py
path('questions/', views.QuestionModelView.as_view()),
path('questions/<int:id>/', views.QuestionModelViewID.as_view()),
path('questions/<int:id>/answer/', views.AnswerModel.as_view()),
我的意见.py
# Create your views here.
class QuestionModelView(mixins.ListModelMixin, mixins.CreateModelMixin,GenericAPIView):
queryset = models.QuestionModel.objects.all()
serializer_class = serializers.QuestionModel_serializer
permission_classes = [IsAuthenticated]
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class QuestionModelViewID(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,GenericAPIView):
queryset = models.QuestionModel.objects.all()
serializer_class = serializers.QuestionModel_serializer
permission_classes = [IsAuthenticated]
lookup_field = 'id'
def get(self, request, id=None):
if id:
return self.retrieve(request, id)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
def put(self, request, id=None):
if int(request.POST.get('author')) != self.request.user.id:
return Response("you cannot edit othe user question", status=status.HTTP_405_METHOD_NOT_ALLOWED)
if id:
return self.update(request, id)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
def delete(self, request, id=None):
if int(request.POST.get('author')) != self.request.user.id:
return Response("you cannot destroy othe user question", status=status.HTTP_405_METHOD_NOT_ALLOWED)
if id:
return self.delete(request, id)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
class AnswerModel(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
lookup_field = 'id'
serializer_class = serializers.AnswerModel_serializer
def get_queryset(self, *args, **kwargs):
return models.AnswersModel.objects.filter(question_id = self.kwargs['id'])
def get(self, request, id=None):
return self.list(request)
def post(self, request, id=None):
if request.user.is_superuser:
return self.create(request, id)
else:
return Response("only superuser can post a answer", status=status.HTTP_400_BAD_REQUEST)
我想创建一个类似 questions/id/answers/answer_id 的网址,其中 id 是问题 id,而 answer_id 是特定答案的 id,因为一个问题可以有多个答案,但为此我想在我的查看我不知道如何添加它,或者如果不可能这样做,请为此查询建议另一种方法
【问题讨论】:
-
Django rest 框架默认支持一个查找字段。如果您想要更多查找字段,请尝试创建自定义 mixin,例如 MultipleFieldLookupMixin:django-rest-framework.org/api-guide/generic-views/…
标签: django django-rest-framework