Django: получить все сведения обо всех экземплярах тестовой модели, назначенных пользовательской модели

#python-3.x #django

#python-3.x #django

Вопрос:

Ниже приведен мой models.py модели:

 from django.db import models
from django.contrib.auth.models import User

class Question(models.Model):      
  question= models.TextField()       
  optionA= models.CharField(max_length= 32)
  optionB= models.CharField(max_length= 32)
  optionC= models.CharField(max_length= 32)
  optionD= models.CharField(max_length= 32)
  answer= models.CharField(max_length= 6, choices= options, default= 'A')      

class Test(models.Model):
  
  name= models.CharField(max_length= 16)
  questions= models.ManyToManyField(Question)      

class TestTaker(models.Model):
  user= models.OneToOneField(User, on_delete= models.CASCADE)
  tests= models.ManyToManyField(Test)   
  

Ниже приведено мое определение домашней функции, которая отображает веб-сайт
главная страница внутри views.py

 def home(request):  
  try:
    tests= TestTaker.objects.filter(user= request.user).values('tests')   
    print(tests.values)     
    # tests= Test.objects.filter(user= request.user)
    return render(request, 'tests/home.html', {'tests': tests})
  except:
    print('excepted')
    return render(request, 'tests/home.html') 
  

Я хочу извлечь все тесты, назначенные зарегистрированному пользователю. Я могу получить только тестовые объекты, назначенные аутентифицированному пользователю, но я хочу иметь возможность получать весь каждый тест вместе с его вопросами. Как я могу это сделать?

Ответ №1:

Вам не нужно ничего передавать в template, вы можете напрямую отображать тесты, подобные этому:

 {% if user.is_authenticated %}
    {% for test in user.testtaker.tests.all %}
        {{ test }}
        {% for qus in test.questions.all %}
            {{ qus }}
        {% endfor %}
    {% endfor %}
{% else %}
    Please log in
{% endif %}
  

Вы можете напрямую обращаться к TestTaker экземпляру пользователя, поскольку он имеет OneToOne связь с User экземпляром.