我有两个模型:
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)
这给了我以下结果:
此后,我被困住了,我不再可以使用注释来使用TruncMonth并将精度总和分组为几个月。如果执行此操作,则会出现此错误: “ ValueError:注释'month'与模型上的字段冲突。”
如果可以,我仍然需要将它们划分为审核总数(在第一个模型上为count('accuracy'))。
我在文档中了解到使用联合会存在一些限制:
“此外,在结果QuerySet上仅允许LIMIT,OFFSET,COUNT(*),ORDER BY和指定列(即切片,count(),order_by()和values()/ values_list())此外,数据库对组合查询中允许的操作设置了限制。例如,大多数数据库在组合查询中不允许LIMIT或OFFSET。“
我需要帮助才能使它正常工作,或者是更好的方法。