#django #foreign-keys #signals
Вопрос:
Когда я создаю нового ученика, я хотел бы, чтобы все поля manytomanyfields и все поля внешнего ключа показывали одинаковые результаты
список студентов — репетиторов — список уроков по многим предметам- многие предметы
студенты обучали_би — многому
уроки студент — иностранный ключ headed_by — иностранный ключ
как правильно это сделать?
я действительно теряюсь в сигналах и в том, что нужно поместить внутрь, особенно при создании или редактировании многих полей.
мой сигнал, который создает урок, принимает
if created:
student = instance
lesson = Lessons.objects.create(
student = student,
)
но не
if created:
student = instance
lesson = Lessons.objects.create(
student = student,
headed_by = student.taught_by,
)
в signals.py:
@receiver(post_save, sender=Students)
def createdStudentToLesson(sender, instance, created, **kwargs):
if created:
student = instance
lesson = Lessons.objects.create(
student = student
)
print("lesson saved")
@receiver(m2m_changed, sender=Students.taught_by.through)
def changeStudentTaughtBy(sender, instance, pk_set, action, **kwargs):
print("action", action)
print("pk_set", pk_set)
print("instance", instance)
print("sender", sender)
в models.py:
class Lessons(models.Model):
student = models.ForeignKey(Students, on_delete=models.SET_NULL, null=True)
headed_by = models.ForeignKey(Tutors, on_delete=models.SET_NULL, null=True)
day = models.CharField(max_length=4, choices=DAY_CHOICES, null=True)
start_time = models.TimeField(null=True, blank=True)
type = models.CharField(max_length=7, choices=TYPE_CHOICES, null=True)
price_band = models.CharField(max_length=7, choices=PAYMENT_TYPE_CHOICES, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True )
def __str__(self):
return str(self.student) " at " str(self.start_time)
class Meta:
ordering=['student','start_time']
class Students(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
taught_by = models.ManyToManyField("Tutors", blank=True)
school_year = models.CharField(max_length=2, choices=YEAR_CHOICES, null=True, blank=True)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
id = models.UUIDField(default=uuid.uuid4, primary_key=True,
unique=True, editable=False)
def __str__(self):
return str(self.name)
class Meta:
ordering = [
"name"
]
class Tutors(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
studentlist = models.ManyToManyField('Students', blank=True)
lessonlist = models.ManyToManyField('Lessons', blank=True)
short_bio = models.CharField(max_length=100,null=True, blank=True)
rate = models.CharField(choices=PAYMENT_TYPE_CHOICES, max_length=7,
blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
id = models.IntegerField(primary_key=True, unique=True)
def __str__(self):
return str(self.name)
thank you so much for your time in advance.