Ошибка экземпляра в поле внешнего ключа Django - PullRequest
0 голосов
/ 14 июля 2020

Я в тупике, и мне нужна помощь. У меня есть две таблицы информации о студентах и ​​студентах. Информация о студенте - это вся информация опекуна этого студента. Я отделил эти данные от основной таблицы учеников, чтобы вы могли добавить столько опекунов, сколько захотите, в файл учеников с новыми записями. Я получаю следующую ошибку.

Невозможно присвоить «1»: «StudentInformation.studentpsid» должен быть экземпляром «Student».

В приложении вы увидите мой код. Studentpsid в информации о студенте - это внешний ключ от студента.

def ImportStudentGuardian(request):
    AuthTokenP(request)
    print("Getting student guardian data from SIS for K-8")
    #Pulls K-8 Guardians
    url = "removed for posting"
    payload = {}
    token = APIInformation.objects.get(api_name="PowerSchool")
    key = token.key
    headers = {'Authorization': 'Bearer {}'.format(key)}   
    response = requests.request("GET", url, headers=headers, data = payload)
    encode_xml = response.text.encode('utf8')
    xml_string = ET.fromstring(encode_xml)
    students = xml_string.findall("student")
    for student in students:
      #XML Values
      psid = student.find("id").text
      try:
       mother = student.find("contact").find("mother").text
      except Exception:
       mother = ""   
      try: 
       father = student.find("contact").find("father").text
      except Exception:
       father = "" 
      if Student.objects.filter(studentpsid=psid).exists():  
        print("Accessing guardian information.")
        m = StudentInformation.objects.create(studentpsid=psid,guardian_name = mother, relation = "Mom")   <---- Function Fails here
        print("Record doesn't exist for mom, creating record.")
        m.save()
        d= StudentInformation.objects.create(studentpsid=psid,guardian_name = father, relation = "Dad")
        print("Record doesn't exist for dad, creating record.")
        d.save()
      return ("Updated Guardian Information ")
Model

class Student(models.Model):
    studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
    student_name = models.CharField(max_length = 50)
    first_name = models.CharField(max_length = 50, default = "")
    last_name = models.CharField(max_length = 50,default = "")
    gender = models.CharField(max_length = 1,default = "")
    student_grade = models.CharField(max_length = 2, default = "")
    home_room = models.CharField(max_length = 5, default = "")
    student_enrollment = models.CharField(max_length = 2, default = "")
    school_number = models.CharField(max_length = 15, default = "") 
    email = models.EmailField(default = "")
    projected_graduation_year = models.CharField(max_length = 4, default = "")
    counseling_goal = models.TextField(max_length = 255)
    class_name = models.ManyToManyField(TeacherClass)
    image = models.ImageField(default ="default.png", upload_to ='student_pics')

# Guardian Information For Student 
class StudentInformation(models.Model):
      studentpsid = models.ForeignKey(Student,on_delete = models.CASCADE, default = "" ,) 
      guardian_name = models.CharField(max_length = 50, default = "")
      RELATION_CHOICES = [
        (0, 'None'),  
        (1, 'Mom'),
        (2, 'Dad'),
        (3, 'Other'),
             ]
      relation = models.PositiveSmallIntegerField(choices = RELATION_CHOICES,)
      guardian_cell = models.CharField(max_length = 12, default = "")
      guardian_email = models.EmailField(max_length = 80,blank = True, default = "")
      prefered_contact = models.BooleanField(default = False, blank = True)
      DAY_CHOICES = [
        (0, 'None'),  
        (1, 'Monday'),
        (2, 'Tuesday'),
        (3, 'Wednesday'),
        (4, 'Thursday'),
        (5, 'Friday'),
             ]
      day_of_week =  models.PositiveSmallIntegerField(choices = DAY_CHOICES, default = 0 )
      time = models.CharField(max_length= 7, default = "", blank = True)
      

Ответы [ 2 ]

1 голос
/ 14 июля 2020

При создании записи с отношением внешнего ключа должен быть предоставлен экземпляр связанной таблицы, чтобы таблица могла поддерживать связь для этой конкретной записи.

Получить экземпляр Student таблицы с заданным psid и используйте его при создании записи StudentInformation

EDIT : Включена часть для создания записи, только если доступны значения mother и father.

for student in students:
      #XML Values
    psid = student.find("id").text
    try:
        psid_obj = Student.objects.get(studentpsid=psid) #(pk = psid) also works as the field is primary key
        try:
            mother = student.find("contact").find("mother").text
            m = StudentInformation.objects.create(studentpsid=psid_obj,guardian_name = mother, relation = "Mom")
            m.save()
        except Exception as err1:
            print "Error at Mom", str(err1)   
        try: 
            father = student.find("contact").find("father").text
            d= StudentInformation.objects.create(studentpsid=psid_obj,guardian_name = father, relation = "Dad")
            d.save()
        except Exception as err2:
            print "Error at Dad",str(err2)
    except:
        print "Student Record Not found"
1 голос
/ 14 июля 2020

Как говорится в ошибке, вы назначаете тип данных char полю ForeignKey.

Сначала вы должны получить экземпляр этого Student, а затем назначить его к вашему объекту StudentInformation, например:

if Student.objects.filter(studentpsid=psid).exists():  
        print("Accessing guardian information.")
        student = Student.objects.get(pk=psid)  # this will fail if the student doesn't exist
        m = StudentInformation.objects.create(studentpsid=student,guardian_name = mother, relation = "Mom")   <---- Function Fails here
        print("Record doesn't exist for mom, creating record.")
        m.save()
        d= StudentInformation.objects.create(studentpsid=student,guardian_name = father, relation = "Dad")
        print("Record doesn't exist for dad, creating record.")
        d.save()
      return ("Updated Guardian Information ")
...