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, PPK , dan Jururawat hadir bertugas dan berada di bilik masing masing, dan membuat persediaan untuk 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 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 – 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, PPK , dan Jururawat hadir bertugas dan berada di bilik masing masing, dan membuat persediaan untuk 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 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 – 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, PPK , dan Jururawat hadir bertugas dan berada di bilik masing masing, dan membuat persediaan untuk 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.