簡體   English   中英

為什么我的python腳本用來自另一個表的偽數據填充Django表會導致錯誤?

[英]Why does my python script to populate a Django table with dummy data from another table result in error?

因此標題說明了我的目標。 這是我為實現此目的而編寫的代碼:

#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)

這以以下錯誤結束:

django.db.utils.IntegrityError: UNIQUE constraint failed: 
student_progress_progress_report.standard_mastered_id

我要填充的progress_report表為空。 我可以使用管理界面向其中添加記錄。 所以我不確定在哪里可以解決我的問題,因為我不太確定問題是什么。 感謝您的查看和提供的任何提示。 -GH

這些是模型:

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)])

您已經告訴數據庫您要維護unique約束! 您嘗試插入的數據將違反該約束,因此事務失敗。

Django為此提供了各種幫助器。 例如Progress_Report.objects.update_or_create(…)可能會有所幫助。 有關更多信息,請參見:

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update-or-create

確切的調用取決於您要強制執行的約束。

我偶然發現了答案:我將Progress_Report.student和Progress_Report.standard_mastered的字段類型從OnetoOneField更改為ForeignKey。 現在,python代碼可以完美運行,並且完全按預期填充數據庫,而不會出現錯誤。

我不知道為什么這可以解決問題。 我希望我能更好地理解問題所在,但是我很感謝它已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM