Trying to trigger a bulkcreation of records using a reverse relationship

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Trying to trigger a bulkcreation of records using a reverse relationship

DumbaClassics
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Trying to trigger a bulkcreation of records using a reverse relationship

Chetan Ganji
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 

P.S. both of this operations should happen inside a transaction. 


Regards,
Chetan Ganji
+91-900-483-4183


On Fri, Nov 13, 2020 at 4:41 PM DumbaClassics <[hidden email]> 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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMKMUjvhmpEbB4LeEBnYX5-e8LPVb3m7wpzSChh-F2fyJDTKpg%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Trying to trigger a bulkcreation of records using a reverse relationship

DumbaClassics
thank you @Chetan the solution does work and I am very grateful!!!!!!

On Fri, Nov 13, 2020 at 5:35 PM Chetan Ganji <[hidden email]> wrote:
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 

P.S. both of this operations should happen inside a transaction. 


Regards,
Chetan Ganji
+91-900-483-4183


On Fri, Nov 13, 2020 at 4:41 PM DumbaClassics <[hidden email]> 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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMKMUjvhmpEbB4LeEBnYX5-e8LPVb3m7wpzSChh-F2fyJDTKpg%40mail.gmail.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMLk3fynHELM5My2mkzzPGo4moAYoU0d7XR0umhzKzbSKPaLSw%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Trying to trigger a bulkcreation of records using a reverse relationship

Chetan Ganji
Welcome :) 

Regards,
Chetan Ganji
+91-900-483-4183


On Fri, Nov 13, 2020 at 9:22 PM Dumba Classics <[hidden email]> wrote:
thank you @Chetan the solution does work and I am very grateful!!!!!!

On Fri, Nov 13, 2020 at 5:35 PM Chetan Ganji <[hidden email]> wrote:
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 

P.S. both of this operations should happen inside a transaction. 


Regards,
Chetan Ganji
+91-900-483-4183


On Fri, Nov 13, 2020 at 4:41 PM DumbaClassics <[hidden email]> 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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/2742a034-586d-44a2-872a-5d0c24dc8d70n%40googlegroups.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMKMUjvhmpEbB4LeEBnYX5-e8LPVb3m7wpzSChh-F2fyJDTKpg%40mail.gmail.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMLk3fynHELM5My2mkzzPGo4moAYoU0d7XR0umhzKzbSKPaLSw%40mail.gmail.com.

--
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 [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAMKMUjss29mBLruZrrw%2BouTsLgvEQhsa8hsWs60azodGGwzMzQ%40mail.gmail.com.