Добавление двух отдельных полей модели для расчета среднего - PullRequest
0 голосов
/ 18 марта 2019

У меня есть две модели:

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 в комбинированных запросах. "

Мне нужна помощь, чтобы заставить это работать или еще лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...