Django order_by将查询集随机化两次?

时间:2020-01-02 05:31:16

标签: python django sqlite

我正在尝试将我正在研究的程序的查询集随机化。

这就是我的观点。py

full_quiz = Quiz.objects.get(name=quiz_name).questions.all()
form = TheForm(full_quiz)
if request.method == "POST":
    form = QuestionForm(request.GET, full_quiz)

这就是我的表格。py

class QuestionForm(forms.Form):
def __init__(self, questions, *args, **kwargs):
    super(QuestionForm, self).__init__(*args, **kwargs)
    for i in range(len(questions)): 
        if questions[i].answer.count() < 2:
            self.fields["field_name %d" % i] = forms.CharField(label=questions[i], required=False)

从我的测试来看,查询集似乎正在使用第二个form变量进行随机化。有解决办法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以按照here中所述获得随机订单查询集:

full_quiz = Quiz.objects.get(name=quiz_name).questions.order_by('?')

您尚未发布表单的代码,但我希望QuestionForm是ModelFormSet。您可以通过设置queryset arg来更改ModelFormSet的queryset(请参见docs):

form = QuestionForm(queryset=fullquiz)

假设您具有这样的模型结构

class Quiz(models.Model):

    name = models.CharField('Quizname', max_length=200)
    questions = models.ManyToManyField('Question')

class Answer(models.Model):

    reply = models.CharField('Answer', max_length=100)

class Question(models.Model):

    the_question = models.CharField('Question', max_length=100)
    answers = models.ManyToManyField('Answer', related_name='answers')
    correct_answer = models.ForeignKey('Answer', on_delete=models.CASCADE)

    def is_correct(self, given_answer):
        return given_answer == self.correct_answer

您可以使用ModelFormModelFormSet创建表单结构:

class QuestionForm(forms.ModelForm):
    myanswers = forms.ModelChoiceField(queryset=Answer.objects.all(), widget=forms.RadioSelect, required=False)
    class Meta:
        model = Question
        fields = ('the_question', 'myanswers')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['myanswers'].queryset = self.instance.answers.all()


QuestionFormSet = modelformset_factory(Question, form=QuestionForm, extra=0)

并在视图中使用它:

def myview(request, quiz_name):

  if request.method == 'POST':
      formset = QuestionForm(request.POST)
      if form.is_valid():
          allanswers = [f['id'].is_correct(f['myanswers']) for f in formset.cleaned_data]
          print('Number of correct answers:', sum(allanswers))

  fullquiz = Quiz.objects.get(name=quiz_name).questions.order_by('?')
  formset = QuestionForm(queryset=fullquiz)
  return render(request, 'yourtemplate.html', {'formset': formset })
相关问题