Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么用另一个表中的伪数据填充Django表的python脚本会导致错误?_Python_Django - Fatal编程技术网

为什么用另一个表中的伪数据填充Django表的python脚本会导致错误?

为什么用另一个表中的伪数据填充Django表的python脚本会导致错误?,python,django,Python,Django,因此,标题说明了我的目标。下面是我为实现它而编写的代码: #for each cycle in instructional cycles: for cycle in Instructional_Cycle.objects.all(): #for each standard in the currently selected cycle: for standard in cycle.standards.all(): #generate random percen

因此,标题说明了我的目标。下面是我为实现它而编写的代码:

#for each cycle in instructional cycles:
for cycle in Instructional_Cycle.objects.all():

    #for each standard in the currently selected cycle:
    for standard in cycle.standards.all():

        #generate random percentage of correct grade-level students to pass that standard, say between 20 and 90%
        percent_pass = randint(20,90)

        #calculate number of total students for that grade-level that percentage represents (percentage times total number of students in that grade)
        total_students_passing = (percent_pass/100) * Student.objects.filter(grade_level = standard.grade_level).count()

        already_selected = []

        #while length of list of already selected students < total needed
        while len(already_selected) < total_students_passing:

            #select a random student out of that grade
            count = Student.objects.filter(grade_level=standard.grade_level).count()
            random_student = Student.objects.all()[randint(0, count - 1)] #single random object

            #if that student isn't in list of already selected students
            if not random_student.id in already_selected:

                #create a passing progress report with the end date of that instructional cycle
                Progress_Report.objects.create(date=cycle.date_finished, student=random_student, standard_mastered=standard, mastery_status=True)

                #add that student to list of already selected students
                already_selected.append(random_student.id)
我尝试填充的进度报告表为空。我可以使用管理界面向它添加记录。所以我不确定该去哪里解决我的问题,因为我不确定问题出在哪里。感谢您的关注和提供的任何提示。-生长激素

以下是模型:

from django.db import models
from django.urls import reverse

gradeLevels = ((6,6), (7,7),(8,8),(9,9), (10,10), (11,11), (12,12))
subjects = (('Literacy','Literacy'), ('Math','Math'),
    ('Science','Science'), ('Social Studies','Social Studies'))


class Student(models.Model):

    student_id = models.CharField(max_length=8, unique=True)
    last_name = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    grade_level = models.IntegerField(choices=gradeLevels)
    active_status = models.BooleanField(default=True)

    class Meta:
        ordering = ['grade_level', 'last_name']

    def __str__(self):
        #Return a string representation of the model.
        return self.student_id + ' ' + self.last_name + ', ' + self.first_name

    def student_name(self):
        return self.last_name + ', ' + self.first_name

    def get_absolute_url(self):
        return reverse('student_progress:student_detail', args=[str(self.id)])

class Standard(models.Model):

    subject = models.CharField(max_length=14, choices=subjects)
    grade_level = models.IntegerField(choices=gradeLevels)
    descriptor = models.CharField(max_length=15)
    description = models.TextField()
    essential_status = models.BooleanField(default=False)


    class Meta:
        ordering = ["subject", "grade_level", "descriptor"]

    def __str__(self):
        return self.descriptor + ': ' + self.description[:100]

    def get_absolute_url(self):
        return reverse('student_progress:standard_detail', args=[str(self.id)])

class Milestone (models.Model):

    step_number = models.IntegerField()
    statement = models.CharField(max_length=250, default="I can ...")
    standard = models.ForeignKey(Standard, on_delete=models.CASCADE,         
        related_name='milestones', null=True, blank=True)

    def __str__(self):
        return str(self.step_number) + ': ' + self.statement[:50]

class Progress_Report(models.Model):

    date = models.DateField(null=True)
    student = models.OneToOneField(Student, on_delete=models.CASCADE)
    standard_mastered = models.OneToOneField(Standard, 
        on_delete=models.CASCADE)
    mastery_status = models.BooleanField(default=True)

    class Meta:
        ordering = ["date", "student"]

    def __str__(self):
        return self.date

class Instructional_Cycle(models.Model):
    date_started = models.DateField(blank=False)
    date_finished = models.DateField(blank=False)
    standards = models.ManyToManyField(Standard, related_name="standards")

    class Meta:
        ordering = ['date_started']

    def __str__(self):
        return str(self.date_started) + ' to ' + str(self.date_finished)

    def get_absolute_url(self):
        return reverse('student_progress:cycle_detail', args=[str(self.id)])

您已经告诉数据库要维护一个
唯一的
约束!您尝试插入的数据将违反该约束,因此事务将失败

Django为此提供了各种帮助。例如
Progress\u Report.objects.update\u或\u create(…)
可能会有所帮助。有关详细信息,请参阅:


确切的调用将取决于您想要实施的约束。

我意外地找到了答案:我将Progress\u Report.student和Progress\u Report.standard\u mastered的字段类型从OnetoOneField更改为ForeignKey。现在,python代码运行良好,完全按照预期填充数据库,没有错误


我不知道这为什么解决了这个问题。我希望我能更好地理解问题所在,但我很庆幸问题已经解决。

恐怕我不明白我是怎么做到的。我阅读了您推荐的页面,似乎得到的结论是:“像get_或_create()和create(),如果您使用手动指定的主键,并且需要创建一个对象,但该键已存在于数据库中,则会引发IntegrityError。”Progress_报告表为空,所以我不明白我是如何添加非唯一数据的。我建议在模型定义中搜索
unique
,并确保插入的数据与这些约束一致。如果这只是测试数据,您可以捕获异常并忽略它,可能是在记录它之后
django.db.connection.querys
对于查看实际发送到数据库的语句也很有用请参见:(告诉我们为什么不适用,搜索此错误消息时还有其他原因。)可能重复参考文章中建议的,删除数据库,删除迁移,重新运行makemigrations并迁移。仍然有错误。我将编辑这个问题,添加我的模型,以防有任何启发。不幸的是,在搜索了这个错误之后,我阅读了尽可能多的发布的问题,但没有一个给出具体的解决方案,也没有一个给出确切的解释。请看下面--我自己意外地找到了答案。OneToOne意味着每一个正在学习的学生可以有一个且只有一个相关的学生,反之亦然。同样,每个标准报告都可以有一个且只有一个相关标准,反之亦然。不幸的是,如果您正在创建多个进度报告对象实例并随机选择学生和标准,最终会出现以下情况:为多个进度报告选择相同的学生或标准,您已经告知ORM不允许(因为您使用了OneTONE)。
from django.db import models
from django.urls import reverse

gradeLevels = ((6,6), (7,7),(8,8),(9,9), (10,10), (11,11), (12,12))
subjects = (('Literacy','Literacy'), ('Math','Math'),
    ('Science','Science'), ('Social Studies','Social Studies'))


class Student(models.Model):

    student_id = models.CharField(max_length=8, unique=True)
    last_name = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    grade_level = models.IntegerField(choices=gradeLevels)
    active_status = models.BooleanField(default=True)

    class Meta:
        ordering = ['grade_level', 'last_name']

    def __str__(self):
        #Return a string representation of the model.
        return self.student_id + ' ' + self.last_name + ', ' + self.first_name

    def student_name(self):
        return self.last_name + ', ' + self.first_name

    def get_absolute_url(self):
        return reverse('student_progress:student_detail', args=[str(self.id)])

class Standard(models.Model):

    subject = models.CharField(max_length=14, choices=subjects)
    grade_level = models.IntegerField(choices=gradeLevels)
    descriptor = models.CharField(max_length=15)
    description = models.TextField()
    essential_status = models.BooleanField(default=False)


    class Meta:
        ordering = ["subject", "grade_level", "descriptor"]

    def __str__(self):
        return self.descriptor + ': ' + self.description[:100]

    def get_absolute_url(self):
        return reverse('student_progress:standard_detail', args=[str(self.id)])

class Milestone (models.Model):

    step_number = models.IntegerField()
    statement = models.CharField(max_length=250, default="I can ...")
    standard = models.ForeignKey(Standard, on_delete=models.CASCADE,         
        related_name='milestones', null=True, blank=True)

    def __str__(self):
        return str(self.step_number) + ': ' + self.statement[:50]

class Progress_Report(models.Model):

    date = models.DateField(null=True)
    student = models.OneToOneField(Student, on_delete=models.CASCADE)
    standard_mastered = models.OneToOneField(Standard, 
        on_delete=models.CASCADE)
    mastery_status = models.BooleanField(default=True)

    class Meta:
        ordering = ["date", "student"]

    def __str__(self):
        return self.date

class Instructional_Cycle(models.Model):
    date_started = models.DateField(blank=False)
    date_finished = models.DateField(blank=False)
    standards = models.ManyToManyField(Standard, related_name="standards")

    class Meta:
        ordering = ['date_started']

    def __str__(self):
        return str(self.date_started) + ' to ' + str(self.date_finished)

    def get_absolute_url(self):
        return reverse('student_progress:cycle_detail', args=[str(self.id)])