从Mysql获取价值并传递给Django

时间:2020-01-03 10:06:53

标签: 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 = 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',)

views.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})

您能帮我理解我做错了什么吗,以及如何为某些数学主题取得价值。

我希望能有帮助和指导来理解和执行它。我在努力一个月。

2 个答案:

答案 0 :(得分:5)

注释

  1. 在“个人资料”中添加一个字段,该字段对于每个学生而言都是唯一的。目前,我假设姓名和姓氏组合将是唯一的。

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

  3. 如果您已经在数据库中,则不必编写模型。您可以删除模型。在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'

views.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 :(得分:3)

@ Nina

请注意关系>这是学生和成绩表模型的基本概念

import { HttpErrorResponse } from '@angular/common/http';
import { throwError } from 'rxjs';

export class ErrorHandler {
    public static handleError(error: HttpErrorResponse) {
        return throwError(error.error);
    }
}

因此,如果您需要搜索特定学科的学生成绩:

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

然后,您将获得Nina的Student Class实例。

现在按关系获取数据:

      std_info = Student.objects.get(std_name='Nina')

您将获得QuerySet。然后:

     std_grade =  std_info.gradesheet_set.filter(sub='math') 

您将获得学生对特定学科的分数。看它的模型关系。因此,您也可以使用其他过滤选项来获得所需的结果。

根据您的给定模型:

您应该使用 Profile 对象代替 profile_id ,这将帮助您通过django ORM进行控制。

std_grade[0].grade

因此您的查询可以通过以下方式构建:

  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')

在这里,您与模型的关系:Profile到Class10是 OneToOne

相关问题