Получение вывода из объединенных таблиц с помощью Django
У меня есть следующие примеры таблиц в MySQL DB, с которыми взаимодействует Django
class Env(models.Model):
name = models.CharField()
class ExecutionDetail(models.Model):
executionid= models.ForeignKey(Execution)
job= models.CharField()
class Execution(models.Model):
name= models.ForeignKey(Env)
executionid= models.CharField()
envname= models.ForeignKey(Env)
Я выбираю данные с помощью представлений
def v_job_history(request, job):
logger.debug("Calling history jobs")
jobname=job
myjobs = ExecutionDetail.objects.filter(job=job)
template = loader.get_template('history_jobs.html')
context = {
'myjobs': myjobs,
}
return HttpResponse(template.render(context, request))
Затем в моем HTML я пытаюсь отобразить мои данные, например
{% for x in myjobs %}
<tr>
<td>{{ x.execution.envname}} </a></td>
<td>{{ x.execution.name }} </a></td>
<td>{{ x.job}}</td>
</tr>
{% endfor %}
Проблема в том, что x.execution.env_name вернет объект Environment (2) и т.д.
Я пробовал x.execution.env_name - возвращает объекты. x.env.name, x.execution.env.name, которые ничего не возвращают.
Я бы посоветовал давать ForeignKey
более подходящие имена, .executionid
это не идентификатор Execution
, это Execution
объект, так что:
class Env(models.Model):
name = models.CharField(max_length=128)
class ExecutionDetail(models.Model):
execution = models.ForeignKey(Execution, on_delete=models.CASCADE)
job = models.CharField()
class Execution(models.Model):
name = models.ForeignKey(Env)
executionid = models.CharField(max_length=128)
env = models.ForeignKey(Env, on_delete=models.CASCADE)
тогда вы можете использовать:
{% for x in myjobs %}
<tr>
<td>{{ x.execution.env.name }}</a></td>
<td>{{ x.execution.name }} </a></td>
<td>{{ x.job }}</td>
</tr>
{% endfor %}
и повысить эффективность с помощью:
def v_job_history(request, job):
logger.debug('Calling history jobs')
jobname = job
myjobs = ExecutionDetail.objects.filter(job=job).select_related(
'execution__env'
)
context = {
'myjobs': myjobs,
}
return render(request, 'history_jobs.html', context)