[英]Creating a Foreign Key in Django Model
我的學生模型中有以下內容。 我想跟蹤給每個學生的每個點的日期。 這個想法是這樣我不僅可以看到每個學生有多少分,而且還可以看到每個學分的日期。 在未來,我希望看到學生積分的趨勢。 我該怎么辦呢? 我應該在另一個班級使用外鍵嗎? 我是新手,所以感謝閱讀。
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)
我想你可能想把這兩個課分開(我稱之為'課程',以免與課堂上的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)
然后,學生可以參加許多課程,並獲得每門課程的一系列分數(即考試分數?)。
你可以這樣:
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將自動設置為保存模型的日期和時間。 我剛剛發布了一個可以根據您的需求定制的基本模式。
我將創建一個名為Points的新文檔,其中包含一個datetime字段,並修改Student以引用Document Points而不是Point作為IntegerField。
如果您使用的是mongoengine,我建議將Points設為EmbeddedDocument並將其嵌入Student。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.