Пытаюсь узнать, сколько рядов у меня разных флотов в django - PullRequest
1 голос
/ 28 мая 2020

Я работаю над проектом, в котором есть 3 модели.

  • Устройства: все устройства, задействованные в проекте.
  • Парки: каждое устройство входит в один парк.
  • Данные: данные, которые отправляют устройства.

Теперь я хочу знать, сколько данных пришло мне сегодня.

На мой взгляд, у меня есть это,

def dataPlots(request):
    today = datetime.date(2020, 5, 18)
    data = DevData.objects.filter(data_timestamp__date=today)
    data  = loads(serializers.serialize('json', data))

Если я использую len(), я могу теперь получить общее значение. Но как я могу узнать, сколько данных у меня есть для каждого парка?

Я пришел, чтобы создать этот l oop, который будет сообщать мне для каждого устройства, но мне нужно значение для каждого парка и Более того, я думаю, что я усложняюсь.

data_dict = {}
for d in data:
    if d['fields']['dev_eui'] in data_dict:
        data_dict[d['fields']['dev_eui']] = data_dict[d['fields']['dev_eui']] + 1
    else:
        data_dict[d['fields']['dev_eui']] = 1

print(data_dict)

Модели:

class Fleet(models.Model):
    fleet_id = models.IntegerField(primary_key=True, unique=True)
    fleet_name = models.CharField(max_length=20, unique=True)

class Device(models.Model):
    dev_eui = models.CharField(max_length=16, primary_key=True, unique=True)
    dev_name = models.CharField(max_length=20, unique=True)

    fleet_id = models.ForeignKey(Fleet, on_delete=models.CASCADE)

    def __str__(self):
        return self.dev_eui

class DevData(models.Model):
    data_uuid = models.UUIDField(primary_key=True, default=uuid.uuid1, editable=False)
    data_timestamp = models.DateTimeField()
    data = models.FloatField()

    dev_eui = models.ForeignKey(Device, on_delete=models.CASCADE)

    def __str__(self):
        return self.dev_eui

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

1 Ответ

1 голос
/ 28 мая 2020

Вы можете аннотировать Fleet s заданным объемом данных, например:

from django.db.models import Count

Fleet.objects.filter(
    device__devdata__data_timestamp__date=today
).annotate(
    total_data=Count('device__devdata')
)

Объекты Fleet, возникающие из этого набора запросов, будут иметь дополнительный атрибут .total_data, содержащий общий объем данных для today.

...