我正在开展第一个涉及学生成绩册的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 StudentForm(forms.ModelForm):
class Meta:
model = Student
fields= ('name_text',)
但这并没有奏效。我会得到一个错误,说课程字段不能为空(列#34中的空值; course_id"违反非空约束)。所以我修改为:fields(' course',' name_text,)。这很有用。
这让我想知道课程课程是否真的有必要。最后,我希望能够上传带有学生姓名的文本文件,解析文本以获取姓名(和电子邮件地址)并创建学生实例。只有这样我才能指派学生上一门课程。但我觉得现在我的模型设置方式总是坚持为学生分配课程。
课程应该保留吗?
答案 0 :(得分:2)
如果学生课程之间存在1-n关系(一门课程中的学生很多,只有一门课程的学生),那就完全正确了。
使用CharField代替保存course_name
最终会导致不一致(请参阅db normalization),例如从这样开始:
name_text | course_name
-----------------------
chris | cs-101
doug | cs-101
现在cs-101被重命名为cs-101-old而cs-101是一个具有不同主题的新课程。然而,数据库仍然说我们都在新的“新”课程。如果您有ForeignKey
到Courses
,您只需更改一个值,学生表中的值也会更改,因为它们只是指针。
如果您希望课程是可选的,只需在ForeignKey声明中添加null=True
。
course = ForeignKey(Courses, null=True)