2012-03-28 84 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