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

Отдельно, я бы поставил вопрос, правильно ли иметь имя класса как поле на Студенте. Это подразумевает, что студент может только взять один класс. –

ответ

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, я бы рекомендовал делать Points EmbeddedDocument и встраивать его в Student.

+0

Er, что такое «Ссылка», если это не секретный ключ? –

+0

Хорошая точка. Я привык к mongoengine и, следовательно, использую EmbeddedDocuments. Мой первоначальный ответ был таким, но я понял, что OP не использует mongoengine, поэтому я поменял свой ответ, но пропустил извлечение ссылочной части. – Sid

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 

Я не был уверен, что если вы хотите, чтобы отслеживать точки в каждом классе тоже. В этом случае просто добавьте classname в модель Point.

Также обратите внимание, что Point.creation_datetime будет автоматически установлен на дату и время сохранения модели. Я просто разместил базовый шаблон, который вы можете настроить для своих нужд.

+0

Возможно, я ошибаюсь в его требованиях, но, думаю, он хочет записать, например, 80 очков на дату A и 84 точки в дате B и т. Д., Затем просмотрите временные ряды или добавьте их. – alan

+0

@alan да, это правильно. Я бы хотел увидеть тенденцию для каждого ученика. – Zach

Смежные вопросы