根据另一个模型更新一个模型的外键

时间:2020-02-09 06:38:15

标签: python django

我有一个学生模型:

class Student(User):
    religion = models.ForeignKey(
        Religion, on_delete=models.SET_NULL, null=True)
    caste = models.ForeignKey(Caste, on_delete=models.SET_NULL, null=True)
    date_of_birth = models.DateField(default=timezone.now)
    parent_name = models.CharField(max_length=255, default=None)
    address = models.CharField(max_length=255, default=None)
    phone_number1 = models.CharField(
        "Phone Number 1", max_length=10)
    phone_number2 = models.CharField(
        "Phone Number 2 (optional)", max_length=10, blank=True)
    classes = models.ForeignKey(
        Class, on_delete=models.SET_NULL, default=None, null=True, blank=True)

    def __str__(self):
        return self.first_name+" "+self.last_name

    # Control model features
    class Meta:
        verbose_name = 'Student'
        verbose_name_plural = 'Students'

还有一个录取模型:

class Admission(models.Model):
    admission_date = models.DateField()
    classes = models.ForeignKey(
        Class, on_delete=models.SET_NULL, null=True)
    student = models.ForeignKey(
        Student, on_delete=models.SET_NULL, null=True)

还有一个班级模型,它吸收了学生所在班级的所有信息:

class Class(models.Model):

    class_name = models.CharField(
        max_length=10,
        default=None
    )
    division_name = models.CharField(
        max_length=10,
        default=None
    )
    class_teacher = models.ForeignKey(
        Teacher, on_delete=models.SET_NULL, default=None, null=True, blank=True)
    institute = models.ForeignKey(
        Institute, on_delete=models.SET_NULL, default=None, null=True, blank=True)

    def __str__(self):
        return self.class_name+" "+self.division_name+" "+self.institute.name

    # Control model features
    class Meta:
        verbose_name = 'Class'
        verbose_name_plural = 'Classes'

我想实现以下目标:根据招生模型更改学生信息。当我更新录取信息时,它应该上课并根据录取模型中提供的课程更新学生模型中的课程。如何实现?

1 个答案:

答案 0 :(得分:0)

也许您可以尝试使用信号?

from django.dispatch import receiver
from django.db.models.signals import post_save

@receiver(post_save, sender= Admission)  # it works after saving (created or updated)
def update_student_info(sender, instance, **kwargs):
    # change student info based on the admissions model
    admission_class = instance.classes
    admission_student = instance.student
    admission_student.classes = admission_class
    admission_student.save()