Python 以交互方式连接两个模型
我正在尝试为我的学校创建一个LMS(学习管理系统)系统。在这个系统中,我试图在origen_教室模型和学生与教师模型之间建立联系,这样更新其中一个模型将更新其他模型。我尝试使用信号,但它在这个模型上不起作用(它在用户模型上起作用) 附件是我的代码:Python 以交互方式连接两个模型,python,django,python-3.x,django-models,signals,Python,Django,Python 3.x,Django Models,Signals,我正在尝试为我的学校创建一个LMS(学习管理系统)系统。在这个系统中,我试图在origen_教室模型和学生与教师模型之间建立联系,这样更新其中一个模型将更新其他模型。我尝试使用信号,但它在这个模型上不起作用(它在用户模型上起作用) 附件是我的代码: from django.db import models from django.contrib.auth.models import AbstractUser from django.dispatch import receiver from dj
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.dispatch import receiver
from django.db.models.signals import post_save
from .utils import upload_location, phone_regex
from materials.models import Subject
# Add fields to user module and uplaod image to the media location
class User(AbstractUser):
USER_TYPE_CHOICES = (
(1, 'student'),
(2, 'teacher'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES,
blank=True,
null=True
) # user type
date_of_birth = models.DateField(blank=True, null=True)
phone_number = models.CharField(validators=[phone_regex],
max_length=11,
blank=True
) # validators should be a list
profile_image = models.ImageField(upload_to=upload_location,
blank=True,
default='test.png',
height_field='height_field',
width_field='width_field',
)
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
class Meta:
verbose_name_plural = "Users"
def __str__(self):
return self.username
# main student module
class Student(models.Model):
user = models.OneToOneField(
User, related_name='student', on_delete=models.CASCADE)
origen_class = models.ForeignKey(
'OrigenClass', on_delete=models.SET_NULL, blank=True, null=True)
def __str__(self):
return self.user.username
# main teacher module
class Teacher(models.Model):
user = models.OneToOneField(
User, related_name='teacher', on_delete=models.CASCADE)
head_class = models.OneToOneField('OrigenClass', on_delete=models.SET_NULL, blank=True, null=True)
teacher_subject = models.ForeignKey(Subject, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.user.username
# using signal to save changes in users into students or teachers
# TBD when changing from teacher to student need to check if already exist in one list and delete him
@receiver(post_save, sender=User)
def append_to_user_type(sender, **kwargs):
if kwargs.get('created', False):
if kwargs.get('instance').user_type == 2:
Teacher.objects.get_or_create(user=kwargs.get('instance'))
elif kwargs.get('instance').user_type == 1:
Student.objects.get_or_create(user=kwargs.get('instance'))
elif not kwargs.get('instance')._state.adding:
if kwargs.get('instance').user_type == 2:
Teacher.objects.get_or_create(user=kwargs.get('instance'))
elif kwargs.get('instance').user_type == 1:
Student.objects.get_or_create(user=kwargs.get('instance'))
class Grade(models.Model):
GRADE_CHOICES = (
(1, 'Grade 10'),
(2, 'Grade 11'),
(3, 'Grade 12'),
)
grade = models.PositiveSmallIntegerField(
choices=GRADE_CHOICES, blank=True, null=True) # Grade type
def __str__(self):
return self.GRADE_CHOICES[self.grade - 1][1]
class OrigenClass(models.Model):
grade = models.ForeignKey(
Grade, related_name='Grade', on_delete=models.CASCADE)
class_name = models.PositiveIntegerField(blank=True, null=True)
head_teacher = models.OneToOneField(
Teacher, related_name='head_teacher', on_delete=models.CASCADE)
students_members = models.ManyToManyField(Student, related_name='students')
def __str__(self):
return f'{self.grade} Class {self.class_name}'
@receiver(post_save, sender=Teacher)
def append_head_teacer_toclass(sender, **kwargs):
if kwargs.get('created', False):
OrigenClass.objects.get_or_create(head_teacher=kwargs.get('instance'))
elif not kwargs.get('instance')._state.adding:
OrigenClass.objects.get_or_create(head_teacher=kwargs.get('instance'))
我想您的
附加\u head\u teacer\u到类(sender,**kwargs)
中有一些错误。当您试图创建OriginClass
实例时,您缺少一些必填字段,这些字段不能是None
,例如grade
因此,当您保存未设置OriginClass
的教师实例时,这将引发错误
如果关联的
OriginClass
实例已经存在,那么您只是获取该实例,而不是更新任何内容。要更新实例,您应该使用update\u或\u create
您是否检查了append\u head\u Teacher\u To class
如果保存了Teacher
实例,是否调用了信号函数?是的,我尝试了两种方法都没有成功对不起,我的问题不清楚。你是说信号函数没有被调用吗?它被调用了(我知道这是因为我在终端中检查了),但是如果我编辑一个教师并添加他的源类,源类就不会更新。顺便问一下,你真的需要实现AbstractUser
类吗?您只需创建一个概要文件模型,并以一对一的方式将其链接到用户。