Обновление внешнего ключа одной модели на основе другой модели - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть модель студента:

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 голосов
/ 09 февраля 2020

Может быть, вы можете попробовать использовать сигнал?

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...