python 如何将数据插入到带有外键表和OneToOne字段的Django模型中?

64jmpszr  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(203)

“大家好,我希望你们一切都好。我目前面临着一个问题,在模型中插入数据与外键表和OneToOne字段。我试过插入数据,但没有成功。如果有人能帮助我或提供一些如何解决这个问题的指导,那就太好了。任何见解或建议将不胜感激。提前感谢您的时间和帮助!“

型号:

class Department(models.Model):
    department = models.CharField(max_length=100)

    def __str__(self) -> str:
        return self.department
    
    class Meta:
        ordering = ['department']

class StudentID(models.Model):
    student_id = models.CharField(max_length=100)

    def __str__(self) -> str:
        return self.student_id
    
class Student(models.Model):
    department = models.ForeignKey(Department, related_name='depart', on_delete=models.CASCADE)
    student_id = models.OneToOneField(StudentID, related_name='studentId', on_delete=models.CASCADE)
    student_name = models.CharField(max_length=100)
    student_email = models.EmailField(max_length=100)
    student_age = models.IntegerField(default=18)
    student_address = models.TextField()

    def __str__(self) -> str:
        return self.student_name
    
    class Meta:
        ordering = ['student_name']
        verbose_name  = 'student'
    

class Subject(models.Model):
    subject_name = models.CharField(max_length=100)

    def __str__(self) -> str:
        return self.subject_name

class SubjectMark(models.Model):
    student = models.ForeignKey(Student, related_name='studentmark', on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    marks = models.IntegerField()

    def __str__(self) -> str:
        return f' {self.student.student_name} {self.subject.subject_name} '

    class Meta:
        unique_together = ['student' , 'subject']

我试过这个观点,但我得到的只是错误。

浏览次数

def create_student(request):
    if request.method == "POST":
        data = request.POST
        student_id = data.get('student_id')
        student_name = data.get('student_name')
        department = data.get('department')
        student_email = data.get('student_email')
        student_address = data.get('student_address')
        student_age = data.get('student_age')
        marks = data.get('marks')
        subject = data.get('subject')

        Student.objects.create(
            student__student_id = student_id,
            student__department = department,
            student__student_name = student_name,
            student__student_email = student_email,
            student__student_age = student_age,
            student__student_address = student_address,
            marks = marks,
            subject__subject_name = subject
        )
    
        return redirect('/student/')
    context = {'page' : "Add Student"}
    
    return render(request, 'report/add_student.html', context)

如果有人能解决这个问题,请确保它的后视图方法与它如何插入数据从UI。谢谢。

pinkon5k

pinkon5k1#

您正在尝试使用Student模型上不存在的字段创建数据库行。看看你的模型定义:

class Student:
    department = ...
    student_id = ...
    student_name = ...
    student_email = ...
    student_age = ...
    student_address = ...

现在看看你传递给Student.objects.create()的内容:

student__student_id = ...
student__department = ...
student__student_name = ...
student__student_email = ...
student__student_age = ...
student__student_address = ...
marks = ...
subject__subject_name = ...

请注意,每个参数都以student__为前缀,因此它会查找不存在的字段(student__student_id等)。您需要删除student__前缀。
此外,student_iddepartment不是原始字段,它们是外键。在为StudentID对象定义Student对象上的关系之前,StudentID对象必须存在。与Deparment相同。先创造他们,然后再创造他们。

department = Department.objects.create(department="Computer Science")
student_id = StudentID.objects.create(student_id="100")

student = Student.objects.create(
    student_id=student_id,
    department=department,
    ...
)

最后,markssubjectStudent模型上不存在。您必须单独创建它们,就像上面的示例一样。

jbose2ul

jbose2ul2#

试试这个,希望有帮助

def create_student(request):
    if request.method == "POST":
        data = data(request.POST)
        if data.is_valid():
            student_id = data.validated_data.get('student_id')
            student_name = data.validated_data.get('student_name')
            department = data.validated_data.get('department')
            student_email = data.validated_data.get('student_email')
            student_address = data.validated_data.get('student_address')
            student_age = data.validated_data.get('student_age')
            marks = data.validated_data.get('marks')
            subject = data.validated_data.get('subject')
            
            # getting the department
            try:
                student_department = Department.objects.get( department = department )
            except Department.DoesNotExist:
                return False
            
            # getting the student ID 
            try:
                student_ID = StudentID.objects.get( student_id = student_id )
            except StudentID.DoesNotExist:
                return False
            

            # storing the student record 
            student = Student()      
            student.department = student_department
            student.student_name = student_name
            student.student_email = student_email
            student.student_age = student_age
            student.student_address = student_address
            student.save()
            student.student_id.add( student_ID )

            # storing the subject
            student_subject = Subject() 
            student_subject.subject_name = subject
            student_subject.save()
            
            # storing the students marks which includes the
            #the student details , subjects and subjects marks
            student_subject_mark = SubjectMark()
            student_subject_mark.student = student #which is referring to the student profile created above
            student_subject_mark.subject = student_subject #which is student_subject profile created 
            student_subject_mark.marks = marks
        

            return redirect('/student/')
    context = {'page' : "Add Student"}
    
    return render(request, 'report/add_student.html', context)

相关问题