在Django Mod中创建外键

2024-04-20 01:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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) 

Tags: 模型modelslength学生趋势分数max外键
3条回答

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

如果您使用的是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

我不确定你是否也希望跟踪每节课的分数。在这种情况下,只需将类名添加到点模型。

另外,请注意Point.creation_date time将自动设置为保存模型的日期和时间。我刚刚发布了一个基本的模式,你可以定制你的需要。

我认为您可能希望将类(我称之为“Course”,以免与类的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)

然后学生可以选修许多课程并获得一系列分数(即考试分数?)每道菜。

相关问题 更多 >