繁体   English   中英

如何使用 Django Rest Framework 显示基于子类别的问题?

[英]How to display questions based on subcategory using Django Rest Framework?

我想根据子类别显示所有问题。

这是我的代码:

模型.py

class Subcategory(models.Model):
    subcategory_id = models.BigAutoField(primary_key=True)
    subcategory = models.CharField(max_length=40)

    class Meta:
        managed = True
        db_table = 'subcategory'

    def __str__(self):
        return self.subcategory

class Question(models.Model):
    question_id = models.BigAutoField(primary_key=True)
    subcategory = models.ForeignKey('Subcategory', models.DO_NOTHING, default=None)
    question = models.TextField()
    answer = models.CharField(max_length=255)

    class Meta:
        managed = True
        db_table = 'question'

    def __str__(self):
        return self.question

序列化程序.py

class SubcategorySerializer(serializers.ModelSerializer):

class Meta:
    model = Subcategory
    fields = ('subcategory_id',
              'subcategory')

class QuestionSerializer(serializers.ModelSerializer):

class Meta:
    model = Question
    fields = ('question_id',
              'subcategory',
              'question',
              'answer')

查看.py

@api_view(['GET', 'POST', 'DELETE'])
def question_list(request):
    # GET list of question, POST a new question, DELETE all question
    if request.method == 'GET':
        questions = Question.objects.all()
    
        question = request.GET.get('question', None)
        if question is not None:
            questions = questions.filter(question__icontains=question)
    
        questions_serializer = QuestionSerializer(questions, many=True)
        return JsonResponse(questions_serializer.data, safe=False)
        # 'safe=False' for objects serialization
    elif request.method == 'POST':
            question_data = JSONParser().parse(request)
            questions_serializer = QuestionSerializer(data=question_data)
            if questions_serializer.is_valid():
                questions_serializer.save()
                return JsonResponse(questions_serializer.data, status=status.HTTP_201_CREATED) 
            return JsonResponse(questions_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'DELETE':
            count = Question.objects.all().delete()
            return JsonResponse({'message': '{} Questions were deleted successfully!'.format(count[0])}, status=status.HTTP_204_NO_CONTENT)

/api/子类别

[
  {
     subcategory_id: 1,
     subcategory: "Mathematics"
  },
  {
     subcategory_id: 2,
     subcategory: "History"
  }
]

/api/问题

[
  {
     question_id: 1,
     subcategory: 1,
     question: "10 + 10 = ?",
     answer: "20"
  },
  {
     question_id: 2,
     subcategory: 1,
     question: "50 + 50 = ?",
     answer: "100",
  },
  {
     question_id: 3,
     subcategory: 2,
     question: "Who was the first president of the United States?",
     answer: "George Washington",
  }
]

从上面的数据中,我有 2 个子类别数学和历史,并且有 3 个基于子类别的问题,2 个关于数学的问题和 1 个关于历史的问题。

如何在/api/questions 中只显示关于数学的 2 个问题?

我仍然是初学者,需要很多指导,请帮助。

试试这个:

        subcategory = request.GET.get('subcategory', None)
        if subcategory is not None:
            questions = questions.filter(subcategory__subcategory__icontains=subcategory)

您必须在 URL 查询参数中传递子类别字符串:

?subcategory=Mathematics

但是,如果您希望始终仅使用Mathematics对其进行过滤:

questions.filter(subcategory__subcategory='Mathematics')

您也可以尝试更改subcategory的领域Subcategory模式,只是name来表示子目录名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM