Python 在Django模型中创建外键

Python 在Django模型中创建外键,python,django,django-models,Python,Django,Django Models,我的学生模型中有以下内容。我想追踪给每个学生的每个分数的日期。这样我不仅可以看到每个学生的分数,还可以看到每个分数给出的日期。在未来,我想看到学生分数的趋势。我该怎么做?我应该在另一个类中使用外键吗。我是新手,所以谢谢你的阅读 class Student(models.Model): CLASS_CHOICES = ( (u'Yoga','Yoga'), (u'Spanish', 'Spanish'), (u'French', 'French'),

我的学生模型中有以下内容。我想追踪给每个学生的每个分数的日期。这样我不仅可以看到每个学生的分数,还可以看到每个分数给出的日期。在未来,我想看到学生分数的趋势。我该怎么做?我应该在另一个类中使用外键吗。我是新手,所以谢谢你的阅读

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) 

我将创建一个名为Points的新文档,它有一个datetime字段,并将Student修改为引用文档点,而不是作为整型字段的点


如果您使用的是mongoengine,我建议您将Points作为嵌入式文档并嵌入到Student中。

您可以使用以下内容:

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
[3]中的
:james=Student(classname='Yoga',name='james')
[4]中的james.save()
调试(0.002)插入“testapp_学生”(“名称”、“类名”)值(James,Yoga);args=['詹姆斯','瑜伽']
在[5]中:james.points
调试(0.000)从“测试点”中选择计数(*),其中“测试点”。“学生id”=1;args=(1,)
Out[5]:0
[6]中的james.point\u set.create()
调试(0.001)插入“测试点”(“创建日期时间”,“学生id”)值(2012-03-28 09:38:35.593110,1);args=[u'2012-03-2809:38:35.593110',1]
出[6]:
在[7]中:james.points
调试(0.001)从“测试点”中选择计数(*),其中“测试点”。“学生id”=1;args=(1,)
Out[7]:1
[8]中的james.point\u set.create()
调试(0.001)插入“测试点”(“创建日期时间”,“学生id”)值(2012-03-28 09:38:41.516848,1);args=[u'2012-03-2809:38:41.516848',1]
出[8]:
在[9]中:james.points
调试(0.000)从“测试点”中选择计数(*),其中“测试点”。“学生id”=1;args=(1,)
Out[9]:2
我不确定你是否也想追踪每堂课的分数。在这种情况下,只需将classname添加到点模型中


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

我认为您可能希望将课程(我称之为“课程”,以避免与Python的课程理念冲突)和积分(即分数)跟踪分开


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

呃,如果不是外键,什么是“参考”呢?很好。我习惯于mongoengine,因此使用嵌入式文档。我最初的答案是这样的,但我意识到OP没有使用mongoengine,所以我更改了答案,但没有删除参考部分。另外,我想问一下,在学生的名字中使用
classname
字段是否正确。这意味着学生只能上一节课。我可能误解了他的要求,但我认为他想记录,例如,日期a上80分,日期B上84分,等等。然后查看时间序列或将其相加。@alan是的,没错。我想看看每个学生的趋势。
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)