У меня есть две модели:
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 = нет ошибки), которые довольно легко рассчитать и получить их оценку точности в месяц. (ОШИБКИ / # АУДИТОВ).
Однако мне нужно также рассмотреть возможность добавления ошибок, зарегистрированных во 2-й модели (которые обычно являются эскалациями электронной почты, зарегистрированными в трекере), чтобы точно получить их оценку точности за месяц. Я добавил поле столбца точности, значение по умолчанию которого равно 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: аннотация« месяц »конфликтует с полем в модели».
Если это сработает, мне все равно нужно разделить их на общее количество проверок (количество («точность») в 1-й модели).
Я прочитал в документации, что есть ограничения в использовании union:
"Кроме того, в результирующем QuerySet разрешены только LIMIT, OFFSET, COUNT (*), ORDER BY и заданные столбцы (то есть срезы, count (), order_by () и values () / values_list ()). Кроме того, базы данных накладывают ограничения на то, какие операции разрешены в комбинированных запросах. Например, большинство баз данных не допускают LIMIT или OFFSET в комбинированных запросах. "
Мне нужна помощь, чтобы заставить это работать или еще лучше.