在django中设计模型

时间:2015-08-10 23:50:02

标签: python django django-models models django-orm

我正在开展第一个涉及学生成绩册的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,)。这很有用。

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

课程应该保留吗?

1 个答案:

答案 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是一个具有不同主题的新课程。然而,数据库仍然说我们都在新的“新”课程。如果您有ForeignKeyCourses,您只需更改一个值,学生表中的值也会更改,因为它们只是指针。

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

course = ForeignKey(Courses, null=True)