TypeError: объект DeferredAttribute недопустим в models.py - PullRequest
1 голос
/ 12 февраля 2020

У меня есть этот код в моем models.py

Я просто хочу, чтобы, как только администратор завершил заполнение StudentsEnrollmentRecord, он получал все связанные данные в ScheduleOfPayment и публиковал их в StudentsPaymentSchedule, поэтому у меня есть этот фильтр

scheduleofpayment = ScheduleOfPayment.objects.filter(Payment_Type=instance.Payment_Type,
                                                        Education_Levels=instance.Education_Levels,
                                                        Courses=instance.Courses)

/

class StudentsPaymentSchedule(models.Model):
    Students_Enrollment_Records = models.ForeignKey(StudentsEnrollmentRecord, related_name='+',
                                                    on_delete=models.CASCADE, null=True, blank=True)
    Payment_Schedule = models.CharField(max_length=500, null=True, blank=True)
    Amount = models.FloatField(null=True, blank=True)
    Student_Payment_Date = models.DateField(null=True, blank=True)
    Paid_Amount = models.FloatField(default=0, null=True, blank=True)
    Balance = models.FloatField(null=True, blank=True)
    Remarks = models.TextField(max_length=500, null=True, blank=True)

    @receiver(pre_save, sender=StudentsEnrollmentRecord)
    def get_older_instance(sender, instance, *args, **kwargs):
        try:
            instance._old_instance = StudentsEnrollmentRecord.objects.get(pk=instance.pk)
        except StudentsEnrollmentRecord.DoesNotExist:
            instance._old_instance = None
            print("dddd")

    @receiver(post_save, sender=StudentsEnrollmentRecord)
    def create(sender, instance, created, *args, **kwargs):
        if not created:
            older_instance = instance._old_instance
            if older_instance.Payment_Type != instance.Payment_Type or \
                    older_instance.Education_Levels != instance.Education_Levels:

                StudentsPaymentSchedule.objects.filter(
                    Students_Enrollment_Records=instance
                ).delete()
            else:
                return None

        scheduleofpayment = ScheduleOfPayment.objects.filter(Payment_Type=instance.Payment_Type,
                                                        Education_Levels=instance.Education_Levels,
                                                        Courses=instance.Courses)
        amounts = ScheduleOfPayment.Amount
        date=ScheduleOfPayment.Date
        sched = ScheduleOfPayment.Remark
        for i , each in enumerate(scheduleofpayment):
            amount = amounts[i]
            date = date[i]
            remarks = sched[i]
            StudentsPaymentSchedule.objects.create(
                Students_Enrollment_Records=instance,
                Payment_Schedule = date,
                Amount = amount,
                Remarks = remarks
            )

class StudentsEnrollmentRecord(models.Model):
    Student_Users = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, null=True)
    School_Year = models.ForeignKey(SchoolYear, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    Courses = models.ForeignKey(Course, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    strands = models.ForeignKey(strand, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    Section = models.ForeignKey(Section, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    Payment_Type = models.ForeignKey(PaymentType, related_name='+', on_delete=models.CASCADE, null=True)
    Discount_Type = models.ForeignKey(Discount, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    Education_Levels = models.ForeignKey(EducationLevel, related_name='+', on_delete=models.CASCADE, blank=True,
                                         null=True)
    ESC = models.ForeignKey(esc, on_delete=models.CASCADE, null=True, blank=True)
    Student_Types = models.ForeignKey(student_type, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
    Remarks = models.TextField(max_length=500, null=True, blank=True)

class ScheduleOfPayment(models.Model):
    Education_Levels = models.ForeignKey(EducationLevel, related_name='+', on_delete=models.CASCADE, blank=True,
                                         null=True)
    Courses = models.ForeignKey(Course, related_name='+', on_delete=models.CASCADE, blank=True, null=True)
    Payment_Type = models.ForeignKey(PaymentType, related_name='+', on_delete=models.CASCADE, blank=True, null=True)
    Display_Sequence = models.IntegerField(blank=True, null=True)
    Date = models.DateField(null=True, blank=True)
    Amount = models.IntegerField(null=True, blank=True)
    Remark = models.CharField(max_length=500, blank=True, null=True)

что я пробовал

@receiver(pre_save, sender=StudentsEnrollmentRecord)
    def get_older_instance(sender, instance, *args, **kwargs):
        try:
            instance._old_instance = StudentsEnrollmentRecord.objects.get(pk=instance.pk)
        except StudentsEnrollmentRecord.DoesNotExist:
            instance._old_instance = None
            print("dddd")

    @receiver(post_save, sender=StudentsEnrollmentRecord)
    def create(sender, instance, created, *args, **kwargs):
        if not created:
            older_instance = instance._old_instance
            if older_instance.Payment_Type != instance.Payment_Type or \
                    older_instance.Education_Levels != instance.Education_Levels:

                StudentsPaymentSchedule.objects.filter(
                    Students_Enrollment_Records=instance
                ).delete()
            else:
                return None

        scheduleofpayment = ScheduleOfPayment.objects.filter(Payment_Type=instance.Payment_Type,
                                                        Education_Levels=instance.Education_Levels,
                                                        Courses=instance.Courses)
        amounts = ScheduleOfPayment.Amount
        date=ScheduleOfPayment.Date
        sched = ScheduleOfPayment.Remark
        for i , each in enumerate(scheduleofpayment):
            amount = amounts[i]
            date = date[i]
            remarks = sched[i]
            print("wara")
            StudentsPaymentSchedule.objects.create(
                Students_Enrollment_Records=instance,
                Payment_Schedule = date,
                Amount = amount,
                Remarks = remarks
            )

это ошибка, которую я получаю

enter image description here

1 Ответ

0 голосов
/ 12 февраля 2020

Если у вас есть Queryset scheduleofpayment, вы можете просто выполнить итерацию непосредственно по нему, чтобы получить объекты в наборе запросов:

for schedule in scheduleofpayment:
    date = schedule.Date
    amount = schedule.Amount
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...