如何使用Django Rest框架限制基于记录值的显示数据?

2024-09-28 19:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的代码:

型号.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()

序列化程序.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_id: 1,
     subcategory: "Mathematics"
  },
  {
     subcategory_id: 2,
     subcategory: "History"
  }
]

我有两个子类数据,数学和历史

/api/questions?子类别=数学

[
  {
     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_id: 1,
    num_of_question: 3
  },
  {
    practice_setting_id: 2,
    num_of_question: 5
  }
]

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

我的问题,, 如何根据/api/练习设置中的问题数量限制显示数据

例如num_of_question: 3因此/api/questions?子类别=Mathematics仅显示3个问题,例如,如果值更改为4,则将显示4个问题

我不知道该怎么做, 我还是一个初学者,需要很多指导,请帮助


Tags: ofanswernoneapiidgetmodelsrequest
1条回答
网友
1楼 · 发布于 2024-09-28 19:21:23

要从查询集中获取前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

The .get() here is used to retrieve he object itself and not just the query set, you can also use the .first() function instead of the slice + get like

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

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

相关问题 更多 >