Im not 100% sure about this :P Instead of this - def save(self, *args, **kwargs): if self.records.count() <= 0: for student in self.klass.students.all(): self.records.create(student=student, status='present') super(Attendance, self).save(*args, **kwargs)
Try with below code - def save(self, *args, **kwargs): super(Attendance, self).save(*args, **kwargs) if self.records.count() <= 0: for student in self.klass.students.all(): self.records.create(student=student, status='present') # separate sql query i guess for each entry created. There is a diff logic. 1. create attendance object. 2. bulk create AttendanceRecord objects https://docs.djangoproject.com/en/3.1/ref/models/querysets/#bulk-create P.S. both of this operations should happen inside a transaction. https://docs.djangoproject.com/en/3.1/topics/db/transactions/ Regards, Chetan Ganji +91-900-483-4183 [email protected] http://ryucoder.in On Fri, Nov 13, 2020 at 4:41 PM DumbaClassics <[email protected]> wrote: > Hello Family may you help. > > I am trying to create a School Attendance Module and I have a StudentClass > table, the Student table, Attendance table and the AttendanceRecord table. > Here is the code > > class StudentClass(models.Model): > name = models.CharField(max_length=100) > # stream = models.ForeignKey('Stream', on_delete=models.PROTECT) > creation_date = models.DateTimeField(auto_now=False, > auto_now_add=True) > > > def __str__(self): > return self.name > > class Student(models.Model): > name = models.CharField(max_length=100) > klass = models.ForeignKey('StudentClass', models.PROTECT, > related_name='students') > > def __str__(self): > return self.name > > class Attendance(models.Model): > date = models.DateTimeField(auto_now_add=True) > klass = models.ForeignKey('StudentClass', models.PROTECT, > related_name='attendances') > > def save(self, *args, **kwargs): > if self.records.count() <= 0: > for student in self.klass.students.all(): > self.records.create(student=student, status='present') > super(Attendance, self).save(*args, **kwargs) > > def __str__(self): > return f"{self.id}, {self.date}" > > class AttendanceRecord(models.Model): > ATTENDANCE_STATUS = [ > ('present', 'PRESENT'), > ('absent', 'ABSENT') > ] > attendance = models.ForeignKey( > 'Attendance', > on_delete=models.SET_NULL, > null=True, > blank=True, > related_name='records' > ) > student = models.ForeignKey('Student', on_delete=models.PROTECT) > status = models.CharField(max_length=100, choices=ATTENDANCE_STATUS) > > > def __str__(self): > return f"(STUDENT: {self.student}, STATUS: {self.status})" > > > What am I trying to achieve?? > > I want to have a situation whereby when I trigger the creation of a > Attendance instance an Attendance Record linked to that instance is > generated with the record generating default attendance records for all > students enrolled in that klass with a default attendance status of present > which I can get on to edit only for those students who are absent. The > method I tried for ovveriding the save method didnt work as it generated > this error ' "unsaved related object '%s'." % field.name > ValueError: save() prohibited to prevent data loss due to unsaved related > object 'attendance'.' > > I wasnt really confident of that solution anyway. > > May you assist me on how best one wld solve such a problem > > Thank you in Advance > > Dumba > > > > > > > > > > > > > > > > > > > > > > > > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMKMUjvhmpEbB4LeEBnYX5-e8LPVb3m7wpzSChh-F2fyJDTKpg%40mail.gmail.com.

