python - 使用 autofield 和 unique_constraint Django

标签 python django

我的类应用程序的 models.py:

Teacher 和 StudentInfo 将存储各自的详细信息。

from form.models import StudentInfo
from teacherform.models import Teacher

class ClassRoom(models.Model):
     standard = models.CharField(max_length=50)
     section = models.CharField(max_length=50)
     teacher = models.OneToOneField(Teacher, on_delete = models.CASCADE)

class ClassRoomStudent(models.Model):
     classRoom = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
     rollNumber = models.AutoField()
     student = models.OneToOneField(StudentInfo, on_delete=models.CASCADE)

当我向 ClassRoomStudents 添加新行时,我想自动递增“rollNumber”,但如果学生来自不同类(class),则 rollNumber 计数应该重置,它应该重新开始。因为来自不同教室的不同学生可以拥有相同的卷号。

我知道unique constraint 。但即使在 unique_constraint 之后,我仍然不确定我的 rollNumber 将如何在不同的教室中增加。 就像它不会不断增加 rollNumber 数字一样,这对于不同或相同的类(class)显然是唯一的?

最佳答案

这对于 AutoField 来说是不可能的,因为您无法有条件增加它的值。

相反,您可以使用 IntegerField,重写 save 方法,在其中添加条件并在保存之前设置该字段的值。

为了更清楚地说明这一点,基本上你应该:

class ClassRoomStudent(models.Model):
    classRoom = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
    rollNumber = models.IntegerField()
    student = models.OneToOneField(StudentInfo, on_delete=models.CASCADE

    def save (self):
        if <queryset_that_verify_student_is_from_this_class_exists>:
            self.rollNumber = ClassRoomStudent.objects.filter(classRoom=self.classRoom).last().rollNumber + 1
        else:
            self.rollNumber = 1
        return super().save()

关于python - 使用 autofield 和 unique_constraint Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59223748/

相关文章:

python - 如何允许 POST 在 django rest 框架中进行更新操作

Python PIL字节到图像

python - 如何自省(introspection) django 模型字段?

python - Django 错误 : Field 'id' expected a number but got '{}'

python - Django 默认语言不起作用

django - 成功登录后如何向 Django 的响应上下文添加内容?

python - ImportError ("Couldn' 找不到 FluidSynth 库。”)

python - 如何在 re.compile python 中删除除 br 之外的所有标签?

python - 只允许访问 django 中的未登录用户

javascript - Ajax 通知服务器上的变量更改