Django模型:可以使用多个值作为键吗?

1 投票
1 回答
2791 浏览
提问于 2025-04-15 22:18

这里有一个简单的模型:

class TakingCourse(models.Model):
    course = models.ForeignKey(Course)
    term = models.ForeignKey(Term)

我想用 courseterm 这两个字段作为主键,而不是让Django自动生成一个默认的主键。因为这两个字段结合在一起可以唯一地标识一条记录。Django允许这样做吗?

另外,我想表示用户在某些学期选修课程。有没有更好的方法来实现这个?

class Course(models.Model):
    name = models.CharField(max_length=200)
    requiredFor = models.ManyToManyField(RequirementSubSet, blank=True)
    offeringSchool = models.ForeignKey(School)

    def __unicode__(self):
        return "%s at %s" % (self.name, self.offeringSchool)

class MyUser(models.Model):
    user = models.ForeignKey(User, unique=True)
    takingReqSets = models.ManyToManyField(RequirementSet, blank=True)
    takingTerms = models.ManyToManyField(Term, blank=True)
    takingCourses = models.ManyToManyField(TakingCourse, blank=True)
    school = models.ForeignKey(School)

class TakingCourse(models.Model):
    course = models.ForeignKey(Course)
    term = models.ForeignKey(Term)

class Term(models.Model):
    school = models.ForeignKey(School)
    isPrimaryTerm = models.BooleanField()

1 个回答

5

你可以使用 unique_together 这个选项。

class TakingCourse(models.Model):
    course = models.ForeignKey(Course)
    term = models.ForeignKey(Term)

    class Meta:
        unique_together = ('course', 'term')

不过,如果你能这样做会更好:

class MyUser(models.Model):
    user = models.OneToOneField(User)
    takingReqSets = models.ManyToManyField(RequirementSet, blank=True)
    takingCourses = models.ManyToManyField(Course, through='TakingCourse', blank=True, null=True)
    school = models.ForeignKey(School)

class TakingCourse(models.Model):
    my_user = models.ForeignKey(MyUser)
    course = models.ForeignKey(Course)
    term = models.ForeignKey(Term)

    class Meta:
         unique_together = ('my_user', 'course')

可以了解一下 一对一关系多对多关系中的额外字段

撰写回答