简体   繁体   English

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

[英]Django order_by randomizes queryset twice?

I am trying to randomize a query set for a program i'm working on.我正在尝试为我正在处理的程序随机化查询集。

This is what's is in my views.py这就是我的 views.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)

This is what is in my forms.py这是我的 forms.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)

From my testing, it appears like the query set is getting randomized with the second form variable.从我的测试来看,查询集似乎与第二个表单变量随机化。 Any fix for this?有什么解决办法吗?

Thanks谢谢

You can get a random order queryset as described here :你可以描述得到一个随机的顺序查询集在这里

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

You have not posted the code of your forms but I expect QuestionForm is a ModelFormSet.您尚未发布表单代码,但我希望 QuestionForm 是一个 ModelFormSet。 You can change the queryset of a ModelFormSet by setting the queryset arg (see docs ):您可以通过设置查询集参数来更改 ModelFormSet 的查询集(请参阅文档):

form = QuestionForm(queryset=fullquiz)

Suppose you have a model structure like this假设你有一个这样的模型结构

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

you could create a form structure with a ModelForm and a ModelFormSet :您可以使用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)

And use it in a view:并在视图中使用它:

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 })

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

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