添加两个单独的模型字段以计算平均值

时间:2019-03-18 15:24:34

标签: django django-models django-rest-framework django-forms django-templates

我有两个模型:

class BsoQMS_QA(models.Model):
  id = models.IntegerField(db_column='ID',primary_key=True)  
  audit = models.CharField(db_column='Audit', max_length=50, blank=True, 
                                  null=True) 
  status = models.CharField(db_column='Status', max_length=50, blank=True, 
                   null=True) 
  challenge_decision = models.CharField(db_column='Challenge_Decision', 
                     max_length=50, blank=True, null=True)  
  name = models.CharField(db_column='Name', max_length=50, blank=True, 
                    null=True) 
  timeliness = models.DecimalField(db_column='Timeliness', max_digits=3, 
                   decimal_places=2, blank=True, null=True)  
  accuracy = models.DecimalField(db_column='Accuracy', max_digits=3, 
                  decimal_places=2, blank=True, null=True)  
  start_date = models.DateTimeField(db_column='Start_Date', blank=True, 
                  null=True)  
  closed_date = models.DateTimeField(db_column='Closed_Date', blank=True, 
                    null=True) 
  lastmod_date = models.DateTimeField(db_column='LastMod_Date', blank=True, 
                     null=True)  

  class Meta:
    managed = False
    db_table = 'BSO_QMSQA'

这是另一个:

class QAErrorTracker(models.Model):
  start_date = models.DateTimeField(null=False,blank=False)
  name = models.CharField(max_length=50,null=False,blank=False)
  process = models.CharField(max_length=50,null=False,blank=False)
  author = models.ForeignKey(User,default=None, on_delete=models.CASCADE)
  body = models.TextField()
  accuracy = models.DecimalField(default=1, null=False,max_digits=3, 
     decimal_places=2)

  def __str__(self):
    return self.name

第一个模型由所有质量审核组成,其准确性列的数据为1或0(1 =有错误0 =无错误),这很容易计算并每月获得其准确性评分。 (错误/审核数)。

但是,我还需要考虑添加记录在第二个模型上的错误(通常是跟踪器中记录的电子邮件升级),以准确获取当月的准确性得分。我添加了一个精度列字段,其默认值为1。

我尝试使用Django ORM合并这两个查询集:

from BSO.models import QAErrorTracker, BsoQMS_QA 
from django.db.models import Count, Sum, Avg
from django.db.models.functions import TruncMonth

  #gives me the sum of accuracy on the 1st model on a monthly basis of the year 2019
  QMS = BsoQMS_QA.objects.annotate(month=TruncMonth('start_date')).values('month').annotate(accuracy=Sum('accuracy')).values('month','accuracy').filter(start_date__year=2019)

  #gives me the sum of accuracy on the 2nd model on a monthly basis
  ErrorTracker = QAErrorTracker.objects.annotate(month=TruncMonth('start_date')).values('month').annotate(accuracy=Sum('accuracy')).values('month','accuracy')

  Combined = QMS.union(ErrorTracker)

这给了我以下结果:

union queryset

此后,我被困住了,我不再可以使用注释来使用TruncMonth并将精度总和分组为几个月。如果执行此操作,则会出现此错误: “ ValueError:注释'month'与模型上的字段冲突。”

如果可以,我仍然需要将它们划分为审核总数(在第一个模型上为count('accuracy'))。

我在文档中了解到使用联合会存在一些限制:

“此外,在结果QuerySet上仅允许LIMIT,OFFSET,COUNT(*),ORDER BY和指定列(即切片,count(),order_by()和values()/ values_list())此外,数据库对组合查询中允许的操作设置了限制。例如,大多数数据库在组合查询中不允许LIMIT或OFFSET。“

我需要帮助才能使它正常工作,或者是更好的方法。

0 个答案:

没有答案