在Django中注释2个不同的模型以计算转换率

时间:2019-06-27 14:10:23

标签: django django-queryset python-3.7 django-2.2

我有2个模型,分别是综合浏览量和交易量,我的目标是使用此公式=(总交易量/总综合浏览量)* 100%计算转化率。

这是我的模型结构。

for h in range(len(dpath)):
  path = lidar_save + dpath[h]

  #Combine seperate files to one file over the periode.
  data_month = pd.DataFrame()
  data_month_std = pd.DataFrame()
  wind_rec_gz = glob.glob(path+'/*.csv')
  print('Read: ', wind_rec_gz[0])

  df = pd.read_csv(wind_rec_gz, header=0, sep=';',encoding = 'unicode_escape')
    class Transaction(models.Model):
        user = models.ForeignKey("User", on_delete=models.CASCADE)
        organization = models.ForeignKey(
            "Organization", on_delete=models.CASCADE, null=True
        )
        transaction_id = models.CharField(max_length=64, null=True, blank=True)
        datetime = models.DateTimeField(null=True)
        products = models.ManyToManyField("Product")
        . . . 

我尝试使用其中一些方法:

    class PageView(models.Model):
        user = models.ForeignKey("User", on_delete=models.CASCADE)
        organization = models.ForeignKey(
            "Organization", on_delete=models.CASCADE, null=True
        )
        datetime = models.DateTimeField(null=True)
        url = models.CharField(max_length=2048, blank=True)
        page_name = models.ForeignKey(
            "PageName", on_delete=models.SET_NULL, null=True, blank=True
        )

        products = models.ManyToManyField("Product", blank=True)
        . . .

结果是

User.objects.filter(pageview__datetime__range=(startdate,enddate)).annotate(
y=ExtractYear('pageview__datetime'),
m=ExtractMonth('pageview__datetime'),
d=ExtractDay('pageview__datetime')).values(
'y', 'm', 'd').order_by(
'y', 'm', 'd').annotate(
total=(Cast(Count('conversion__id'), FloatField()) /
Cast(Count('pageview__id'), FloatField())) * 100,
pv=Count('pageview__id', distinct=True),
cv=Count('conversion__id', distinct=True))

问题是,当我使用此查询进行检查时,交易总数不同

. . . 
{
    "y": 2019,
    "m": 4,
    "d": 3,
    "total": 87.9093198992443,
    "pv": 397,
    "cv": 349
}
. . .

结果:

Transaction.objects.filter(
pageview__datetime__range=(startdate,enddate)).annotate(
y=ExtractYear('pageview__datetime'),
m=ExtractMonth('pageview__datetime'),
d=ExtractDay('pageview__datetime')).values(
'y', 'm', 'd').order_by(
'y', 'm', 'd').annotate(cv=Count('id'))

综合浏览量正确,但交易不正确,我的转化率计算错误。当时的总交易额应该是99,但是我得到349。有什么想法吗?非常感谢。

更新

这是我目前的解决方案, 首先,我同时对综合浏览量和交易进行注释,以获取字典列表。

. . . 
{
    "y": 2019,
    "m": 4,
    "d": 3,
    "cv": 99
}
. . .
total_pageview = PageView.objects.filter(organization=org, datetime__range=(start, end)).annotate(y=ExtractYear(
                'datetime'),m=ExtractMonth('datetime'), d=ExtractDay('datetime')).values('y', 'm', 'd').order_by('y', 'm', 'd').annotate(p=Count('id'))

然后使用for循环生成json

total_transaction = Transaction.objects.filter(organization=org, datetime__range=(start, end)).annotate(y=ExtractYear(
                'datetime'),m=ExtractMonth('datetime'), d=ExtractDay('datetime')).values('y', 'm', 'd').order_by('y', 'm', 'd').annotate(c=Count('id'))

我知道这是一个非常丑陋的解决方案,在此期间,我仍将尝试完全使用Django ORM来完成此操作,任何想法将不胜感激,谢谢!!

0 个答案:

没有答案