#django #django-views #django-templates
Вопрос:
Я немного растерян. Прошло некоторое время с тех пор, как я занимался Джанго, и я почти забыл все о наборах запросов и шаблонах. Приложение является вопросником для сравнения разных поставщиков — следовательно, их продуктов. Это вопросник с оценкой (лучшее соответствие) для каждого продукта.
Я хочу получить доступ к определенному элементу в цикле for, который имеет два внешних ключа для других классов. Вот моя модель:
Модель:
class Question(models.Model): questionText = models.CharField(max_length=500) class Vendor(models.Model): vendorName = models.CharField(max_length=30, unique=True) class Scoring(models.Model): score = models.IntegerField(default='0', blank=True) questionScoreForKey = models.ForeignKey(Question, null=True, related_name='scorequestion', on_delete=models.SET_NULL) vendorForKey = models.ForeignKey(Vendor, null=True, related_name='scorevendor', on_delete=models.SET_NULL)
views.py
def index(request): questions = Question.objects.all() vendors = Vendor.objects.all() return render(request, 'compare/index.html', {'questions': questions, 'vendors': vendors})
Шаблон
{% for ask in questions %} lt;trgt; lt;tdgt;{{ ask.questionText }} lt;/tdgt; {% for vend in vendors %} lt;td id="Vendor_{{ ask.pk }}_{{ vend.pk }}" stylegt; {{ HERE THE SCORE OF THE QUESTION AND VENDOR }} lt;/tdgt; {% endfor %} lt;/trgt; {% endfor %}
Оба ключа существуют, но я понятия не имею, как получить доступ к оценке, например, первого вопроса для первых поставщиков. Любой намек будет оценен по достоинству.
Ответ №1:
Вам нужно выполнить обратный запрос результатов. Поскольку вы определили связанные имена в своих моделях, вы можете их использовать.
Обратите внимание, что обратный запрос дает вам объект manager. all
Метод возвращает набор запросов со всеми объектами, соответствующими обратному запросу (вы определили отношение «один ко многим», у одного вопроса/поставщика может быть много баллов). Затем дополнительно отфильтруйте набор запросов, чтобы получить нужный вам экземпляр (например first
).
{{vendor.scorevendor.all.first.score}}
Комментарии:
1. в stackoverflow полно героев. Ты моя. Спасибо! Один комментарий: первая строка — это решение-получение оценки вопроса конкретного поставщика. Но для номера нам нужно указать на поле
score
. Следовательно{{vendor.scorevendor.all.first.score}}
, в противном случае у нас есть только объект. Вторая строка указывает только на первую оценку вопроса текущего идентификатора. Можете ли вы изменить это, и я приму ваш ответ.