Python 从Mysql获取值并传递给Django

Python 从Mysql获取值并传递给Django,python,mysql,django,Python,Mysql,Django,我将我的数据库连接到django。我想让用户(教师)插入学生的姓名,并获得某些科目的测试结果 我运行python3 manage.py inspectdb并将其插入models.py class Profilez(models.Model): student = models.CharField(max_length=255) schgroup = models.CharField(max_length=255) class Meta: managed

我将我的数据库连接到django。我想让用户(教师)插入学生的姓名,并获得某些科目的测试结果

我运行
python3 manage.py inspectdb
并将其插入
models.py

class Profilez(models.Model):
    student = models.CharField(max_length=255)
    schgroup = models.CharField(max_length=255)

    class Meta:
        managed = False
        db_table = 'profilez'


class Schoolz(models.Model):
    profilez_id = models.AutoField(primary_key=True)
    lit = models.IntegerField(blank=True, null=True)
    math = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'schoolz'
forms.py
中,我输入:

class StudentForm(forms.ModelForm):
    SUB = (
        ('lit', 'lit'),
        ('math', 'math')

    )
    student = forms.CharField(max_length=150, label='', widget=forms.TextInput)


    class Meta:
        model = Schoolz
        fields = ('student',)
视图.py中

def home(request):
    if request.method == "POST":
        form = StudentForm(request.POST)
        if form.is_valid():
            form1 = form.save(commit=True)
            name = form1.student

            ab=schoolz.objects.all()


            context={
            'name':name,
            }
            return render(request, 'book/analysis.html', context)

    else:
        form = StudentForm()
        return render(request, 'book/search.html', {'form': form})
你能帮助我了解我做错了什么,以及如何为exmaple数学课程的某些科目获取价值吗


我将感谢您的帮助和指导,以理解和执行它。我挣扎了一个月

尼娜

请查看关系>这是学生和成绩表模型的一般概念

class Student(models.Model):

      std_name = models.CharField(max_length=100)

      def __str__(self):
          return self.std_name


class Gradesheet(models.Model):

      student = models.ForeignKey(Student, on_delete=models.CASCADE)
      sub = models.CharField(max_length=50)
      grade = models.CharField(max_length=50)

      def __str__(self):
          return self.student.std_name
因此,如果您需要搜索特定科目的学生成绩:

      std_info = Student.objects.get(std_name='Nina')
然后您将获得Nina的学生类实例

现在按关系获取数据:

     std_grade =  std_info.gradesheet_set.filter(sub='math') 
你会得到QuerySet。那么就:

std_grade[0].grade
你将得到你的学生在特定科目上的分数。看,这是一种典型的关系。因此,您也可以使用其他过滤选项来获得所需的结果

根据您给定的模型:

您应该使用profile对象,而不是profile\u id,该对象将帮助您通过django ORM进行控制

  class Profile(models.Model):
        student_name = models.CharField(max_length=255)
        student_surname = models.CharField(max_length=255)

        class Meta:
           managed = False
           db_table = 'profile'



 class Class10(models.Model):
       #profile_id = models.IntegerField()
       profile = models.OneToOneField(Profile, on_delete=models.CASCADE,related_name='profile')
       math = models.IntegerField()
       literature = models.IntegerField()
       biology = models.IntegerField()

       class Meta:
          managed = False
          db_table = 'class_10'
因此,您的查询可以通过以下方式生成:

     std_profile = Profile.objects.get(student_name='SomeoneName')
现在把它翻过来,拿到分数结果将是

     math_grade = std_profile.profile.math
     biology_grade = std_profile.profile.biology
     literature_grade = std_profile.profile.literature
     average_grade = ((math_grade + biology_grade + literature_grade)/3) 
这里,您的模型关系:配置文件与Class10是OneToOne

Notes
  • 在配置文件中添加一个字段,该字段对于每个学生都应该是唯一的。目前我假设姓名和姓氏的组合是唯一的

  • 如果您使用ajax,则无需刷新即可获得分数。我目前使用的方法不是很好

  • 如果已经在DB中创建了模型,则不必编写模型。您可以删除您的模型。在models.py和makemigrations中添加已经存在的模型并进行迁移
  • 在Class10中添加ForiegnKey字段

    class Class10(models.Model):
        profile_id = models.IntegerField()
        math = models.IntegerField()
        literature = models.IntegerField()
        biology = models.IntegerField()
        student = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='stud_name') # add this in model
    
        class Meta:
            managed = False  # make this True otherwise makemigrations won't get the changes.
            db_table = 'class_10'
    
    
    class Profile(models.Model):
        student_name = models.CharField(max_length=255)
        student_surname = models.CharField(max_length=255)
    
        class Meta:
            managed = False
            db_table = 'profile'
    
    视图.py

    def home(request):
        if request.method == "POST":
            form = StudentlForm(request.POST)
            if form.is_valid():
                form_1 = form.save(commit=False)
                name = form_1.student_name
                surname = form_1.student_surname
                subject = form_1.subject
                fil = Q(student__student_name=name) & Q(student__student_surname=surname)
                student_1 = StudentScore.objects.filter(fil).values()
                score = student_1[0][subject]  # answer
    
                context={
                'score':score
                }
                return render(request, 'school/analysis.html', context)
    
        else:
            form = StudentlForm()
            return render(request, 'school/search.html', {'form': form})
    
    forms.py

    class StudentForm(forms.ModelForm):
        SUB = (
            ('math', 'math'),
            ('literature', 'literature'),
            ('biology', 'biology')
        )
        student_name = forms.CharField(max_length=150, label='', widget=forms.TextInput)
        student_surname = forms.CharField(max_length=150, label='', widget=forms.TextInput)
        subject = forms.CharField(widget=forms.Select(choices=SUB))
    
        class Meta:
            model = Profile
            fields = ('student_name', 'student_surname', 'subject')
    

    1) 你的观点不正确。它什么也没做。2) 你在哪里保存学生的分数?你能展示模型吗?视图显示并打印学生姓名。但我的目标是从数据库中获取学生的名字和请求,以找到它,并根据它得到学生的数学成绩。它位于mysqlprofile表中。如何创建视图以显示数据库中请求的信息?我会很感激你们的帮助班教授是我的模型链接到数据库。我猜错了吗?它在模型中。py@Nina,您有两个模型,但不存在任何关系。如果没有外键,您将尝试在需要使用两个不同表的位置获取数据!你在你的两个模型中看到外键问题了吗?我没有使用验证,所以在这个答案中,老师必须输入正确的名称,没有拼写错误。我建议将学生姓名设置为带有搜索选项的选择框。@Nina,对不起,我忘记了逗号。@Nina,我已将Class10模型学生字段中的相关姓名编辑为“学生姓名”。早些时候,是“学生名”在配置文件模型中与学生名冲突。可能是您键入的拼写错误。2) 你可以去掉姓氏。只需在模型中执行并迁移即可。请记住更改视图和表单中的所有实例。另外,请检查数据是否可供您正在搜索的学生使用。@Nina,您的模型关系是OneTONE。请看一下更新的代码。@Nina,我不明白你在哪里卡住了。您是否在控制台中尝试过该代码。有时,控制台可以直接调试问题。若它在控制台中工作,那个么它当然会在视图文件中工作。我已经检查了我的代码,它工作得很好,并没有任何错误。获取名称:student\u name=form.cleaned\u data.get('student\u name')@Nina,OneToOne基于ORM。它不关心DB是否支持它。这里每个表都表示为一个模型。我们正在基于该模型建立关系。我们正在对象层中工作。@Nina,请查看更新的代码。可能是:OneToOneField很抱歉。@Nina,您使用相同的名称有多条记录。