Saya sedang mengerjakan proyek yang memiliki 3 model.

  • Perangkat: Semua perangkat yang terlibat dalam proyek.
  • Armada: Setiap perangkat berada dalam satu armada.
  • Data: Data yang dikirim perangkat.

Sekarang saya ingin tahu berapa banyak data yang datang kepada saya hari ini.

Dalam pandangan saya, saya memiliki ini,

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

Jika saya menggunakan len() sekarang saya dapat nilai totalnya. Tapi bagaimana saya bisa tahu berapa banyak data yang saya miliki untuk setiap armada?

Saya datang untuk membuat loop ini yang akan memberi tahu saya untuk setiap perangkat, tetapi yang saya butuhkan adalah nilai untuk setiap armada dan selanjutnya saya pikir saya semakin rumit.

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)

Modelnya adalah:

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

Dapatkah seseorang membantu saya? Saya membayangkan bahwa menggabungkan dua model dan beberapa filter sudah cukup, tetapi saya tidak tahu bagaimana melakukannya.

1
Lleims 28 Mei 2020, 23:29

1 menjawab

Jawaban Terbaik

Anda dapat membubuhi keterangan Fleet dengan jumlah data yang diberikan, misalnya:

from django.db.models import Count

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

Objek Fleet yang muncul dari kumpulan kueri ini akan memiliki atribut tambahan .total_data yang berisi jumlah total data untuk today.

1
Willem Van Onsem 28 Mei 2020, 20:33