2012-03-28 79 views
3

我的学生模型中有以下内容。我想跟踪给每个学生的每个分数的日期。这个想法不仅可以让我看到每个学生有多少分,还可以看到每个分数给出的日期。将来我希望看到学生分数的趋势。我应该怎么做呢?我应该在另一个班级中使用外键吗?我对此很感兴趣,所以感谢您的阅读。在Django模型中创建外键

class Student(models.Model): 
    CLASS_CHOICES = ( 
    (u'Yoga','Yoga'), 
    (u'Spanish', 'Spanish'), 
    (u'French', 'French'), 
    (u'Dance', 'Dance'), 
) 
    name = models.CharField(max_length=30) 
    points = models.IntegerField(max_length=4) 
    classname = models.CharField("Class Name",max_length=20, choices=CLASS_CHOICES) 
+0

另外,我会问是否有'classname'作为学生的字段是正确的。这意味着学生只能参加一门课。 – 2012-03-28 14:42:18

回答

8

我想你可能想打出两个类(我叫它“课程”,以免与类的Python的想法相冲突),并点跟踪(即得分)获得。

class Student(models.Model): 
    name = models.CharField(max_length=30) 
    courses = models.ManyToManyField('Course') 

class Course(models.Model): 
    # Yoga, Spanish, French, etc. 
    name = models.CharField(max_length=30) 

class Score(models.Model): 
    date = models.DateTimeField(auto_now_add=True) 
    points = models.IntegerField(max_length=4) 
    course = models.ForeignKey('Course') 
    student = models.ForeignKey('Student') 

然后,学生可以参加很多课程并获得一系列每门课程的分数分数(即测试分数?)。

0

我会做一个新的文档指定地点其中有一个日期时间字段和修改学生有一个参考文档点,而不是点作为IntegerField。

如果您使用mongoengine,我建议你做点的EmbeddedDocument和学生嵌入它。

+0

呃,如果它不是一个外键,什么是“参考”? – 2012-03-28 14:41:44

+0

好点。我习惯于mongoengine,因此使用EmbeddedDocuments。我原来的答案有,但我意识到OP是不使用mongoengine,所以我改变了我的答案,但错过了参考部分。 – Sid 2012-03-28 14:42:51

2

你可能有这样的事情:

class Student(models.Model): 
    CLASS_CHOICES = ( 
     (u'Yoga','Yoga'), 
     (u'Spanish', 'Spanish'), 
     (u'French', 'French'), 
     (u'Dance', 'Dance'), 
     ) 
    name = models.CharField(max_length=30) 
    classname = models.CharField("Class Name",max_length=20, choices = CLASS_CHOICES) 

    @property 
    def points(self): 
     return self.point_set.count() 

class Point(models.Model): 
    creation_datetime = models.DateTimeField(auto_now_add=True) 
    student = models.ForeignKey('Student') 

使用非常简单:

In [3]: james = Student(classname='Yoga', name='James') 

In [4]: james.save() 
DEBUG (0.002) INSERT INTO "testapp_student" ("name", "classname") VALUES (James, Yoga); args=['James', 'Yoga'] 

In [5]: james.points 
DEBUG (0.000) SELECT COUNT(*) FROM "testapp_point" WHERE "testapp_point"."student_id" = 1 ; args=(1,) 
Out[5]: 0 

In [6]: james.point_set.create() 
DEBUG (0.001) INSERT INTO "testapp_point" ("creation_datetime", "student_id") VALUES (2012-03-28 09:38:35.593110, 1); args=[u'2012-03-28 09:38:35.593110', 1] 
Out[6]: <Point: Point object> 

In [7]: james.points 
DEBUG (0.001) SELECT COUNT(*) FROM "testapp_point" WHERE "testapp_point"."student_id" = 1 ; args=(1,) 
Out[7]: 1 

In [8]: james.point_set.create() 
DEBUG (0.001) INSERT INTO "testapp_point" ("creation_datetime", "student_id") VALUES (2012-03-28 09:38:41.516848, 1); args=[u'2012-03-28 09:38:41.516848', 1] 
Out[8]: <Point: Point object> 

In [9]: james.points 
DEBUG (0.000) SELECT COUNT(*) FROM "testapp_point" WHERE "testapp_point"."student_id" = 1 ; args=(1,) 
Out[9]: 2 

我不知道,如果你想跟踪每类分了。在这种情况下,只需将类名添加到Point模型中即可。

另外,注意Point.creation_datetime将被自动设置为该模型保存的日期和时间。我刚刚发布了一个基本模式,您可以根据自己的需要进行定制

+0

我可能会误解他的要求,但我认为他想记录例如A日期80分,B日84分等,然后查看时间序列或将它们加起来。 – alan 2012-03-28 14:43:24

+0

@alan是的,这是正确的。我希望看到每个学生的趋势。 – Zach 2012-03-28 14:54:06