[英]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.