Merge Python Dictionary atau Django Queryset Berlainan Key

Katakan kita ada 2 django table, senarai tugasan..

            class Tugasan(OrderedModel):
    kategori = models.CharField(max_length=50, unique=True)
    tugasan = RichTextField()

    class Meta:
        verbose_name_plural = 'Tugasan'
        ordering = ['order','kategori']

    def __str__(self):
        return self.kategori
        

dan satu lagi untuk staff yang akan membuat tugasan

            class Standby(models.Model):
    tarikh = models.DateField(
        auto_now=False, auto_now_add=False, default=datetime.now,unique=True, error_messages={"unique": "Data untuk Tarikh ini telah wujud."})
    jxr = models.ForeignKey(staff, verbose_name='Juru X-Ray Kanan Bertugas',
                            on_delete=models.SET_NULL, blank=False, null=True, related_name="standby")
    kjxr = models.ForeignKey(staff, verbose_name='Ketua Juru X-Ray',
                             on_delete=models.SET_NULL, blank=False, null=True, related_name="boss")

    laporan = RichTextField(blank=True, null=True)
    sah = models.BooleanField(default=False)

    slug = AutoSlugField(populate_from=['tarikh'])

    class Meta:
        verbose_name_plural = "Standby"

    def __str__(self):
        return f"{self.tarikh} - {self.jxr.nama}"

    def get_absolute_url(self):
        return reverse("Standby_detail", kwargs={"pk": self.pk})


class Kerja(models.Model):
    standby = models.ForeignKey(Standby, on_delete=models.CASCADE)
    tugas = models.ForeignKey(Tugasan, on_delete=models.CASCADE)
    tindakan = models.BooleanField(default=True)
    catatan = models.CharField(max_length=200, blank=True, null=True)

    class Meta:
        verbose_name_plural = 'Checklist'
        unique_together = ['standby', 'tugas']
        ordering = ['-standby', 'tugas']

    def __str__(self):
        return f"{self.standby} - {self.tugas}"
        

dalam situasi yang pada kebiasaannya semua kerja (tindakan) akan dibuat setiap hari, programmer cap ayam mungkin akan add semua tugas pada table Kerja untuk setiap kerja yang di lakukan. Maknanya, jika ada 21 Tugasan, sebulan akan ada 30 hari x 21 Kerja = 630 data. Mampos!

Tapi sekiranya kita tahu yang secara normalnya checklist tersebut akan di lakukan, kita boleh cuma merekodkan data untuk checklist yang tidak dapat di lakukan oleh sebab-sebab tertentu.

Tapi persoalannya, bagaimana untuk kita gabungkan semua tugasan dengan tugasan yang tidak dapat di lakukan atau mempunyai catatan?

Jawapannya ialah untuk merge queryset. Cara untuk merge queryset sangat senang dengan menggunakan Python, ada banyak cara dan yang paling senang untuk python3.9 ialah

            dict1 | dict2
        

tapi bagaimana cara jika key untuk kedua-dua dictionary tersebut tidak sama? contohnya table Tugasan mempunyai key ID dan table Kerja punya key adalah Tugas.

Mula-mula, convert queryset kepada list

            tugas = list(Tugasan.objects.all().values('id', 'kategori', 'tugasan'))
[{'id': 1,
  'kategori': 'Pengurusan',
  'tugasan': '<p>Menjalankan tugasan pengurusan yang telah ditetapkan</p>'},
 {'id': 2,
  'kategori': 'Kehadiran',
  'tugasan': '<p>Memastikan Juru X-Ray,&nbsp; PPK , dan Jururawat hadir bertugas&nbsp; dan&nbsp; berada di bilik masing masing,&nbsp; dan membuat persediaan untuk&nbsp; memulakan perkhidmatan.</p>'},
 {'id': 3,
  'kategori': 'Buku Laporan  On- Call Juru X-Ray U29',
  'tugasan': '<ul>\n\t<li>Semak dan sign buku laporan on call&nbsp; Juru X-ray U29</li>\n\t<li>Ambil tindakan sekiranya terdapat laporan</li>\n</ul>'},
 {'id': 4,
  'kategori': 'Humidifier Bilik 5',
  'tugasan': '<ul>\n\t<li>Pastikan JXR yang bertugas di Bilik 5, kosongkan tangki di dalam humidifier setiap hari</li>\n\t<li>Pastikan suhu 18˚C &ndash; 22˚C</li>\n\t<li>Dengan kerjasama PSF</li>\n</ul>'},
 {'id': 5,
  'kategori': 'Cuci Kaset',
  'tugasan': '<p>Tugasan PPK mobile (nama) setiap hari</p>'},
}]

kerja = list(Kerja.objects.filter(standby=standbyID).values('standby', 'tugas', 'tindakan', 'catatan'))

[{'standby': 12, 'tugas': 1, 'tindakan': True, 'catatan': 'dismiss? eh'},
 {'standby': 12,
  'tugas': 2,
  'tindakan': True,
  'catatan': 'Memastikan Juru X-Ray,  PPK , dan Jururawat hadir bertugas  dan  berada di bilik masing masing,  dan membuat persediaan untuk  memulakan perkhidmatan.\n\n'},
 {'standby': 12, 'tugas': 3, 'tindakan': True, 'catatan': 'test'},
 {'standby': 12, 'tugas': 4, 'tindakan': False, 'catatan': None}]
        

Kemudian jadikan ID untuk table tugasan sebagai key

            result = {d['id']: d for d in tugas}

{1: {'id': 1,
  'kategori': 'Pengurusan',
  'tugasan': '<p>Menjalankan tugasan pengurusan yang telah ditetapkan</p>'},
 2: {'id': 2,
  'kategori': 'Kehadiran',
  'tugasan': '<p>Memastikan Juru X-Ray,&nbsp; PPK , dan Jururawat hadir bertugas&nbsp; dan&nbsp; berada di bilik masing masing,&nbsp; dan membuat persediaan untuk&nbsp; memulakan perkhidmatan.</p>'},
 3: {'id': 3,
  'kategori': 'Buku Laporan  On- Call Juru X-Ray U29',
  'tugasan': '<ul>\n\t<li>Semak dan sign buku laporan on call&nbsp; Juru X-ray U29</li>\n\t<li>Ambil tindakan sekiranya terdapat laporan</li>\n</ul>'},
 4: {'id': 4,
  'kategori': 'Humidifier Bilik 5',
  'tugasan': '<ul>\n\t<li>Pastikan JXR yang bertugas di Bilik 5, kosongkan tangki di dalam humidifier setiap hari</li>\n\t<li>Pastikan suhu 18˚C &ndash; 22˚C</li>\n\t<li>Dengan kerjasama PSF</li>\n</ul>'},
 5: {'id': 5,
  'kategori': 'Cuci Kaset',
  'tugasan': '<p>Tugasan PPK mobile (nama) setiap hari</p>'},
        

merge 2 list tersebut dengan menggunakan update.

            for d in kerja:
    if d['tugas'] in result:
     result[d['tugas']].update(d)
        

kemudian convert value daripada result kepada list untuk di gunakan dalam template.

            list(result.values())
[{'id': 1,
  'kategori': 'Pengurusan',
  'tugasan': '<p>Menjalankan tugasan pengurusan yang telah ditetapkan</p>',
  'standby': 12,
  'tugas': 1,
  'tindakan': True,
  'catatan': 'dismiss? eh'},
 {'id': 2,
  'kategori': 'Kehadiran',
  'tugasan': '<p>Memastikan Juru X-Ray,&nbsp; PPK , dan Jururawat hadir bertugas&nbsp; dan&nbsp; berada di bilik masing masing,&nbsp; dan membuat persediaan untuk&nbsp; memulakan perkhidmatan.</p>',
  'standby': 12,
  'tugas': 2,
  'tindakan': True,
  'catatan': 'Memastikan Juru X-Ray,  PPK , dan Jururawat hadir bertugas  dan  berada di bilik masing masing,  dan membuat persediaan untuk  memulakan perkhidmatan.\n\n'},
        

Setel!

Penafian: Pihak kami tidak bertanggungjawab terhadap sebarang kehilangan atau kerosakan yang dialami kerana menggunakan maklumat dalam website ini dan segala yang tertera tidak berkenaan dengan sama ada yang hidup atau pun dah mati.

Tiada sebarang komen setakat ini.

Tak puas hati? Tulis komen anda disini

Tags

python
django

Artikel Berkaitan

Revamp

Happy Birthday to me!

haha..se…

Artikel Terkini

VPS & RAM

Baru-baru ni aku cuba untuk m…

Revamp

Happy Birthday to me!

haha..se…