【问题标题】:How to use multiple lookup fields in Django Rest framework in a class based view?如何在基于类的视图中使用 Django Rest 框架中的多个查找字段?
【发布时间】: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 django-rest-framework


【解决方案1】:

如果您有这样的查询questions/id/answers/answer_id

如果我能很好地理解你的问题,你可以这样做。

def get_queryset(self):
        id = self.kwargs['id']
 answerid = self.kwargs['answer_id']
        queryset = Model.objects.get(
            id=id,answerid=answerid)
        return queryset

or 

def get(self, request, id, answer_id):
    Questiomn = Model.objects.get(
            id=id,answerid=answerid)

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2018-11-19
    • 2016-01-23
    • 1970-01-01
    • 2019-04-08
    • 2016-12-25
    • 1970-01-01
    • 2017-12-30
    • 2016-08-16
    相关资源
    最近更新 更多