如何使用 Django Rest Framework 根据记录值限制显示数据?

时间:2021-07-24 23:35:29

标签: python django django-rest-framework

我想根据记录数据值限制显示数据。

这是我的代码:

models.py

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

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

class PracticeSetting(models.Model):
    practice_setting_id = models.BigAutoField(primary_key=True)
    num_of_question = models.SmallIntegerField()

serializers.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',
                  'practice_setting',
                  'question',
                  'answer')

class PracticeSettingSerializer(serializers.ModelSerializer):

    class Meta:
        model = PracticeSetting
        fields = ('practice_setting_id',
                  'num_of_question')

view.py

@api_view(['GET'])
def subcategory_list(request):
    # GET list of subcategory
    if request.method == 'GET':
        subcategories = Subcategory.objects.all()
        
        subcategory = request.GET.get('subcategory', None)
        if subcategory is not None:
            subcategories = subcategories.filter(subcategory__icontains=subcategory)
        
        subcategories_serializer = SubcategorySerializer(subcategories, many=True)
        return JsonResponse(subcategories_serializer.data, safe=False)

@api_view(['GET'])
def question_list(request):
    # GET list of question
    if request.method == 'GET':
        questions = Question.objects.all()
    
        subcategory = request.GET.get('subcategory', None)
        if subcategory is not None:
            questions = questions.filter(subcategory__subcategory__icontains=subcategory)
    
        questions_serializer = QuestionSerializer(questions, many=True)
        return JsonResponse(questions_serializer.data, safe=False)

@api_view(['GET'])
def practiceSetting_list(request):
    # GET list of practiceSetting
    if request.method == 'GET':
        practiceSettings = PracticeSetting.objects.all()
        
        practiceSetting = request.GET.get('practiceSetting', None)
        if practiceSetting is not None:
            practiceSettings = practiceSettings.filter(practiceSetting__icontains=practiceSetting)
        
        practiceSettings_serializer = PracticeSettingSerializer(practiceSettings, many=True)
        return JsonResponse(practiceSettings_serializer.data, safe=False)

/api/subcategory

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

我有 2 个子类别数据,数学和历史。

/api/questions?subcategory=数学

[
  {
     question_id: 1,
     subcategory: 1,
     practice_setting : 1,
     question: "10 + 10 = ?",
     answer: "20"
  },
  {
     question_id: 2,
     subcategory: 1,
     practice_setting : 1,
     question: "20 + 20 = ?",
     answer: "40"
  },
  {
     question_id: 3,
     subcategory: 1,
     practice_setting : 1,
     question: "30 + 30 = ?",
     answer: "60"
  },
  {
     question_id: 4,
     subcategory: 1,
     practice_setting : 1,
     question: "40 + 40 = ?",
     answer: "80"
  },
  {
     question_id: 5,
     subcategory: 1,
     practice_setting : 1,
     question: "50 + 50 = ?",
     answer: "100"
  },
  {
     question_id: 6,
     subcategory: 1,
     practice_setting : 1,
     question: "60 + 60 = ?",
     answer: "120"
  }
]

在数学题表上我有6道题

/api/practice-setting

[
  {
    practice_setting_id: 1,
    num_of_question: 3
  },
  {
    practice_setting_id: 2,
    num_of_question: 5
  }
]

在练习设置列表中,我有 2 个数据,一个有 3 个问题数,另一个有 5 个问题数。

我的问题, 如何根据/api/practice-setting中的问题数量限制显示数据?

例如 num_of_question: 3 所以 /api/questions?subcategory=Mathematics 只显示 3 个问题,例如,如果值更改为 4,则它会显示 4 个问题。 >

我不知道这样做, 我还是个初学者,需要很多指导,请帮忙。

1 个答案:

答案 0 :(得分:0)

要从查询集中获取前 3 个问题,您可以像这样使用数组切片

questions = questions.filter(subcategory__subcategory__icontains=subcategory)[:3] 
 # get the first 3 items

现在由于您还需要检索数据,您可能需要进行另一个查询以首先获取 num_of_questions 字段,例如

first_question = questions.filter(subcategory__subcategory__icontains=subcategory)[1].get()  # get the first item
num_of_questions = first_question.practice_setting.num_of_question  # get the num_of_question field associated with the first question retrieved
questions = questions.filter(subcategory__subcategory__icontains=subcategory)[:num_of_questions]  # get the first n items where n = num_of_questions
<块引用>

这里的.get()用于检索对象本身而不仅仅是查询集,您还可以使用.first()函数代替slice + get like

first_question = questions.filter(subcategory__subcategory__icontains=subcategory).first()  # get the first item

请注意,我依赖于获取与该子类别下的第一个问题相关联的 practice_setting 对象,您可能还有其他首选项,但这只是一个示例,您可以根据需要进行修改

相关问题