在 Django 中设计模型

Designing models in django

我正在处理我的第一个涉及学生成绩簿的 django 项目。从小做起,我只是在开发一个应用程序,教师可以在其中上传学生(学生信息——姓名和电子邮件地址)并将他们组织到课程中。到目前为止我的模型是:

class Course(models.Model):
    course_name = models.CharField(max_length=20, default='Course')

    def __unicode__(self):
        return self.course_name


class Student(models.Model):
    course = models.ForeignKey(Course)
    name_text = models.CharField(max_length=40, default='First Last')
    email_address = models.EmailField(max_length=40, default='address@address.com')

    def __unicode__(self):
        return self.name_text

但是,我不确定是否需要课程 class。我并没有多想,直到我尝试创建我的第一个表单,用户可以在其中将学生添加到数据库中。我试过:

class StudentForm(forms.ModelForm):

    class Meta:
        model = Student
        fields= ('name_text',)

但这没有用。我会收到一条错误消息,指出课程字段不能为空("course_id" 列中的空值违反了非空约束)。于是我修改为:fields('course', 'name_text,)。成功了。

这让我想知道课程 class 是否真的有必要。最终我希望能够上传一个包含学生姓名的文本文件,解析文本以获取姓名(和电子邮件地址)并创建学生的实例。只有这样我才会给学生分配课程。但我感觉我现在设置模型的方式总是坚持为学生分配课程。

是否应该保留 class 课程?

如果学生-课程存在 1-n 关系(很多学生在一门课程,一个学生只在一门课程)是完全正确的。

使用 CharField 而不是保存 course_name 最终会导致不一致(也请参见数据库规范化),例如像这样开始:

name_text | course_name
-----------------------
chris     | cs-101
doug      | cs-101

现在 cs-101 更名为 cs-101-old,cs-101 是一门不同主题的新课程。然而,数据库仍然说我们都在新 "new" 课程中。如果你有一个 ForeignKeyCourses 你只需改变一个值,学生 table 中的值也会改变,因为它们只是指针。


如果您希望课程是可选的,只需在您的 ForeignKey 声明中添加 null=True

course = ForeignKey(Courses, null=True)