Задать вопрос
@ant123
инженер-конструктор перетекающий в программиста

Одновременное отображение данных из двух моделей, как оформить view и template?

Имеются следующие модели, модель информации о датчиках "Sensors" , и модель данных с датчиков "Measurments".
class Sensor(models.Model):
    date_start = models.DateField()
    Latitude =  models.DecimalField(max_digits=18, decimal_places=15)
    Longitude = models.DecimalField(max_digits=18, decimal_places=15)

    def __str__(self):
        return 'id:%s / %s' % (self.id, self.date_start)

class Measurment(models.Model):
    sens = models.ForeignKey(Sensor, on_delete=models.PROTECT)
    time_of_measurment = models.DateTimeField()
    humidity = models.PositiveSmallIntegerField()
    temperature1 = models.DecimalField(max_digits=5, decimal_places=2)
    temperature2 = models.DecimalField(max_digits=5, decimal_places=2)
    temperature3 = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return 'sens_id:%s, time:%s' % (self.sens.id, self.time_of_measurment)


С каждого датчика переодически приходят данные. На странице необходимо вывести данные о датчике и данные последнего измерения из модели "Measurments" соответствующие этому датчику .

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

view:
from .models import Sensor, Measurment
class SenorsListView(generic.ListView):
    model = Sensor, Measurment
    context_object_name = 'sensors_list'
    template_name = 'sensors_list.html'
    queryset = Sensor.objects.all().order_by('-date_start')


template "sensors_list.html":
{% extends "base_generic.html" %}
{% block content %}
    <h1>Sensors List</h1>
    {% if sensors_list %}
    <table class="table">
	<tr>
		<td><h4>ID датчика<h4></td>
		<td><h4>Дата установки<h4></td>
    <td><h4>Долгота<h4></td>
		<td><h4>Широта<h4></td>
		<td><h4>Данные последнего измерения<h4></td>
	</tr>
      {% for sensor in sensors_list %}
      <tr>
		<td>{{sensor.id}}</td>
		<td>{{sensor.date_start}}</td>
   <td>{{sensor.Latitude}}</td>
		<td>{{sensor.Longitude}}</td>
		<td>{{}}</td>
      </tr>
      {% endfor %}
    </table>
    {% else %}
      <p>There are no sensors in the DB.</p>
    {% endif %} 
{% endblock %}

Но как еще притянуть именно нужные данные из модели "Measurments" не могу разобраться.
Пожалуйста, подскажите, каким образом можно решить данную задачку?
  • Вопрос задан
  • 841 просмотр
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@JonGalt
Вообще не вижу проблемы.
Делаете обычный ListView с моделью Senors

from .models import Sensor
from .models import Sensor, Measurment
class SenorsListView(generic.ListView):
    model = Sensor
    context_object_name = 'sensors_list'
    template_name = 'sensors_list.html'
    queryset = Sensor.objects.all().order_by('-date_start')

а в шаблоне делаете так

{% extends "base_generic.html" %}
{% block content %}
    <h1>Sensors List</h1>
    {% if sensors_list %}
    <table class="table">
  <tr>
    <td><h4>ID датчика<h4></td>
    <td><h4>Дата установки<h4></td>
    <td><h4>Долгота<h4></td>
    <td><h4>Широта<h4></td>
    <td><h4>Данные последнего измерения<h4></td>
  </tr>
      {% for sensor in sensors_list %}
      <tr>
    <td>{{sensor.id}}</td>
    <td>{{sensor.date_start}}</td>
   <td>{{sensor.Latitude}}</td>
    <td>{{sensor.Longitude}}</td>
    # Данные последнего датчика
    <td>{{sensor.measurment_set.last.temperature1}}</td>
      </tr>
      {% endfor %}
    </table>
    {% else %}
      <p>There are no sensors in the DB.</p>
    {% endif %} 
{% endblock %}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы