我想根据记录数据值限制显示数据。
这是我的代码:
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 个问题。 >
我不知道这样做, 我还是个初学者,需要很多指导,请帮忙。
答案 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
对象,您可能还有其他首选项,但这只是一个示例,您可以根据需要进行修改