Python 以交互方式连接两个模型

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

我正在尝试为我的学校创建一个LMS(学习管理系统)系统。在这个系统中,我试图在origen_教室模型和学生与教师模型之间建立联系,这样更新其中一个模型将更新其他模型。我尝试使用信号,但它在这个模型上不起作用(它在用户模型上起作用) 附件是我的代码:

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
类吗?您只需创建一个概要文件模型,并以一对一的方式将其链接到用户。