小明:嘿,李老师,最近我在研究一个关于职校研究生管理系统的项目,感觉挺复杂的。
李老师:哦,听起来不错。你打算用什么技术来实现呢?
小明:我想用Python和Django框架来做后端,前端的话可能用Vue.js。不过我对数据库的设计还不太清楚。
李老师:那你要先明确系统的功能需求。比如,学生信息管理、课程安排、成绩记录、导师分配这些模块是不是都要涵盖进去?

小明:对,这些都是核心功能。我之前学过一些数据库的知识,但实际应用起来还是有点吃力。
李老师:那你得先设计好数据表结构。比如学生表、课程表、教师表、选课记录表等。每个表之间要有外键关联。
小明:明白了,那我可以先画个ER图,这样更直观。
李老师:没错,这一步很重要。接下来你可以考虑使用MySQL或者PostgreSQL作为数据库,Django本身支持这些数据库。
小明:那我应该怎么做呢?有没有什么具体的代码示例可以参考?
李老师:当然有。我们可以从创建模型开始。比如,学生模型应该包含学号、姓名、性别、专业、入学时间等字段。
小明:好的,那我来写一段代码试试看。
李老师:很好,记住要使用Django的模型类,然后定义字段类型,比如CharField、DateField等。
小明:
from django.db import models
class Student(models.Model):
student_id = models.CharField(max_length=20, primary_key=True)
name = models.CharField(max_length=100)
gender = models.CharField(max_length=10)
major = models.CharField(max_length=100)
enrollment_date = models.DateField()
def __str__(self):
return self.name
李老师:不错,这段代码很清晰。接下来你还可以添加其他模型,比如课程、教师、选课记录等。
小明:那课程模型应该怎么设计呢?
李老师:课程应该包括课程编号、名称、学分、授课教师、上课时间等字段。同时,还要考虑到选课的关系。
小明:
class Course(models.Model):
course_id = models.CharField(max_length=20, primary_key=True)
name = models.CharField(max_length=100)
credit = models.IntegerField()
teacher = models.ForeignKey('Teacher', on_delete=models.CASCADE)
time = models.CharField(max_length=50)
def __str__(self):
return self.name
李老师:很好,这个模型也合理。现在我们再来看选课记录模型。
小明:

class Enrollment(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
grade = models.FloatField(null=True, blank=True)
def __str__(self):
return f"{self.student} - {self.course}"
李老师:这个模型就完整了。接下来你需要做的是在Django中配置数据库,运行迁移命令生成数据库表。
小明:那我需要在settings.py里设置DATABASES吗?
李老师:是的,你可以使用SQLite作为开发数据库,或者连接MySQL、PostgreSQL。比如,配置如下:
小明:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student_db',
'USER': 'root',
'PASSWORD': 'yourpassword',
'HOST': 'localhost',
'PORT': '3306',
}
}
李老师:对,这样就能连接到MySQL数据库了。然后执行makemigrations和migrate命令,就会自动生成数据库表。
小明:明白了,那我还需要编写视图和模板来展示数据。
李老师:没错。Django的视图负责处理请求,模板负责渲染页面。你可以先做一个学生列表页。
小明:
# views.py
from django.shortcuts import render
from .models import Student
def student_list(request):
students = Student.objects.all()
return render(request, 'students/list.html', {'students': students})
李老师:这段代码是视图函数,它会从数据库中获取所有学生数据,并传递给模板。
小明:那模板文件该怎么写呢?
李老师:模板文件一般放在templates目录下。比如,创建一个students目录,里面放list.html。
小明:
学生列表
{% for student in students %}
{{ student.name }} - {{ student.major }}
{% endfor %}
李老师:这样就可以显示学生信息了。如果需要添加学生,你可以创建一个表单,让用户输入数据。
小明:那表单怎么实现呢?
李老师:Django有内置的表单系统,你可以创建一个StudentForm,然后在视图中处理提交的数据。
小明:
# forms.py
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['student_id', 'name', 'gender', 'major', 'enrollment_date']
李老师:然后在视图中处理POST请求,保存数据。
小明:
# views.py
from django.shortcuts import render, redirect
from .forms import StudentForm
def add_student(request):
if request.method == 'POST':
form = StudentForm(request.POST)
if form.is_valid():
form.save()
return redirect('student_list')
else:
form = StudentForm()
return render(request, 'students/add.html', {'form': form})
李老师:这样你就有了添加学生的功能。接下来你可以继续扩展其他功能,比如查询、修改、删除等。
小明:那权限管理呢?比如不同角色的用户访问不同的功能。
李老师:这是一个重要点。Django有内置的用户认证系统,你可以使用User模型,或者自定义用户模型。
小明:那我应该怎么做呢?
李老师:你可以使用Django的auth模块,设置登录验证,然后根据用户角色控制访问权限。
小明:
# views.py
from django.contrib.auth.decorators import login_required
@login_required
def student_list(request):
students = Student.objects.all()
return render(request, 'students/list.html', {'students': students})
李老师:这样只有登录用户才能访问该页面。如果需要区分管理员和普通用户,可以使用groups或自定义字段。
小明:明白了,这确实是一个重要的安全措施。
李老师:是的,特别是在职校这样的教育机构中,数据安全和权限管理尤为重要。
小明:看来这个系统还有很多可以优化的地方,比如性能、安全性、用户体验等。
李老师:没错,后续你可以考虑引入缓存、使用REST API、部署到服务器等。
小明:谢谢您,李老师,今天学到了很多。
李老师:不客气,继续加油!如果你有任何问题,随时来找我。
