首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外键字段Django上的实例错误

外键字段Django上的实例错误
EN

Stack Overflow用户
提问于 2020-07-14 14:09:50
回答 2查看 79关注 0票数 0

我很困惑,在我的功能上需要帮助。我有两张桌子学生和学生的信息。学生信息是那个学生的全部监护人信息。我将这些数据从主学生表中分离出来,这样您就可以将任意数量的监护人添加到有新记录的学生文件中。我得到的错误如下所示。

无法分配“1”:"StudentInformation.studentpsid“必须是”学生“实例。

附件你会看到我的密码。学生信息是学生的外键。

代码语言:javascript
复制
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 ")
代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-14 14:22:25

在使用外键关系创建记录时,应该提供相关表的实例,以便表能够维护该特定记录的关系。

使用给定的Student获取psid表的实例,并在创建StudentInformation记录时使用该实例

编辑:仅在motherfather值可用时包含用于创建记录的部分。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-07-14 14:21:49

正如错误所述,您正在将一个char数据类型分配给ForeignKey字段。

您应该首先获取该Student的实例,然后将其分配给您的StudentInformation对象,如下所示:

代码语言:javascript
复制
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 ")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62897116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档