Создание внешнего ключа в модели Django - PullRequest
5 голосов
/ 28 марта 2012

В моей модели ученика есть следующее.Я хочу отслеживать дату каждого очка, данного каждому ученику.Идея была бы в том, чтобы я мог видеть не только, сколько баллов имеет каждый студент, но также видеть дату, в которую каждый балл был дан.В будущем я хочу видеть тенденцию очков студентов.Как я должен идти об этом?Должен ли я использовать внешний ключ в другом классе.Я новичок в этом, так что спасибо за чтение.

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) 

Ответы [ 3 ]

11 голосов
/ 28 марта 2012

Я думаю, что вы, возможно, захотите разделить как класс (я называю его «курс», чтобы не вступать в противоречие с идеей 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', on_delete=models.CASCADE)
    student = models.ForeignKey('Student', on_delete=models.CASCADE)

Затем учащийся может пройти множество курсов и получить ряд баллов (то есть тестовых баллов?) За каждый курс.

3 голосов
/ 28 марта 2012

Вы можете получить что-то вроде этого:

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 голосов
/ 28 марта 2012

Я бы создал новый документ с именем «Точки», в котором есть поле даты и времени, и изменил бы в «Студенте» ссылку на точки документа вместо точек в качестве IntegerField.

Если вы используете mongoengine, я бы рекомендовал сделать Points встроенным документом и внедрить его в Student.

...