Search code examples
pythondjangomany-to-many

how to get related objects from a many to many field


I am trying to get the objects from a many to many field. when the user selects their answer I want to be able to get the associated objects from the MtoM field.Then increment the related objects ansData + 1. ans in models was something else but i changed it for reasons, but that is what I am tryning to increment.

models.py

    class User(models.Model):
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    #password = models.CharField(max_length=25)
    email = models.EmailField(max_length=100)

class Quiz(models.Model):
    name = models.CharField(max_length=200,primary_key=True)
    NOQ = models.IntegerField(default=1)
    
   
    

    class Meta:
        verbose_name = "Quiz"
        verbose_name_plural = "Quizzes"
    
    def __str__(self):
        return self.name
    #number Of Questions
class Major(models.Model):  
    major = models.CharField(max_length=200)
    ans = models.IntegerField(default=0)
    answer = models.ManyToManyField('Answer')
    def __str__(self):
        return self.major

class Question(models.Model):
    question_text = models.CharField(max_length=400)
    quiz = models.ForeignKey("Quiz", on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.question_text


class Answer(models.Model):
    question = models.ForeignKey('Question', on_delete=models.CASCADE, null=True)
    answer_text = models.CharField(max_length=200)


    def __str__(self):
         return self.answer_text

class QuizTaker(models.Model):
    user = models.ForeignKey("User", on_delete=models.CASCADE)
    quiz = models.ForeignKey("Quiz", on_delete=models.CASCADE)
    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.user

views.py

    class QuizView(DetailView):
    model = Question
    template_name = 'Quizzes/quiz.html'
    
 
   
    
    
class ResultsView(generic.DetailView):
    model = Question
    template_name = 'JSUMA/results.html'
    

def vote(request, question_id):
    question = get_object_or_404(Question, question_id)
    try:
        selected_answer = question.answer_set.get(pk=request.POST['answer'])
        except (KeyError,Answer.DoesNotExist):
            return render(request, 'Quizzes/quiz.html,' {'question' : question,
            'error_message' : "You didn't select an answer.",})
        else:
            

Solution

    • This is very similar to the Official Django Tutorial showing the Polls App. I recommend you to once view it carefully.
    • Rest, you should add a number of votes integer field to every answer.
    • selected_answer = Answer.objects.get(pk=request.POST['answer'])
    • Now simply increase vote of this answer.