-1

刚开始使用 Django。我正在尝试创建一个名为“average”的自定义 manage.py,其功能是计算 Review 模型中每个字段的平均值并在“AvgMarks”模型中更新它。

型号是:

class AvgMarks(models.Model):
collegeId = models.ForeignKey(College)
overall = models.FloatField()
academics = models.FloatField()
sports = models.FloatField()

class Reviews(models.Model):
collegeId = models.ForeignKey(College)
dateAdded = models.DateField(default=timezone.now())
authorName = models.CharField(max_length=25)
authorEmail = models.EmailField(max_length=100)
authorYear = models.IntegerField()
authorCourse = models.CharField(max_length=50)
category = models.CharField(max_length=20, choices=CATEGORIES)
marks = models.FloatField(default="1.00")
review = models.TextField()

def __str__(self):
    return self.authorName

manage.py 的“average.py”内容为:

from django.core.management.base import BaseCommand, CommandError
from django.db.models import Avg
from college.models import AvgMarks, College
from reviews.models import Reviews

class Command(BaseCommand):
help = "Calculates and save the average for a particular field"

def handle(self, *args, **options):
    colleges = College.objects.all()
    for i in colleges:
        AvgMarks.objects.filter(collegeId=i).update(
            overall = Reviews.objects.filter(collegeId=i).aggregate(Avg('marks'))['marks__avg'],
            academics = Reviews.objects.filter(collegeId=i, category="Academics").aggregate(Avg('marks'))['marks__avg'],
            sports = Reviews.objects.filter(collegeId=i, category="Sports").aggregate(Avg('marks'))['marks__avg'],
        )

    self.stdout.write("Averages done!")

在 Windows Powershell 中运行“python manage.py average”命令时,出现以下错误:django.db.utils.IntegrityError:college_avgmarks.overall may not be NULL

我如何解决它?TIA

4

1 回答 1

0

在做AvgMarks.objects.filter().update()穷人调试之前

print(Reviews.objects.filter(collegeId=i).aggregate(Avg('marks'))['marks__avg'])

您会看到它可能会None不时变为(如果没有要处理的数据则Avg返回)并且不允许/在您的模型定义中。NoneoverallNoneNULL

有一个条件:

overall = Reviews.objects.filter(collegeId=i).aggregate(Avg('marks'))['marks__avg']
if overall is None:
    overall = 0

...update(overall=overall, ...)

您可能还想为其他Avgs执行此操作

于 2015-08-15T18:35:24.947 回答