从Mysql获取值并传递给Django

2024-06-01 01:43:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我将我的数据库连接到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'

我在{}中说:

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

你能帮助我了解我做错了什么,以及如何为exmaple数学课程的某些科目获取价值吗

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


Tags: pyformtruemodelsrequestformsmathlength
2条回答

@尼娜

请查看关系>;这是对学生的总体想法;成绩表模型

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

注释

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

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

  3. 如果已经在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')

相关问题 更多 >