【发布时间】:2019-04-10 17:00:06
【问题描述】:
我正在使用 Django 和 Python 3.7。我有这些模型...
class Article(models.Model):
website = models.ForeignKey(Website, on_delete=models.CASCADE, related_name='articlesite')
title = models.TextField(default='', null=False)
path = models.TextField(default='', null=False)
url = models.TextField(default='', null=False)
created_on = models.DateTimeField(db_index=True, default=datetime.now)
class ArticleStat(models.Model):
objects = ArticleStatManager()
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
elapsed_time_in_seconds = models.IntegerField(default=0, null=False)
hits = models.FloatField(default=0, null=False)
我想编写一个 Django 查询,它返回两列数据——一个 elapsed_time_in_seconds(来自上面的 ArticleStat 模型)和这个特定时间间隔的平均点击次数。混合中还有其他一些限制。我不知道该怎么做。我尝试了以下
qset = ArticleStat.objects.annotate(avg_score=Avg(F("hits")),
hour=(Func(
Func(
F("article__created_on"), function='HOUR FROM'),
function='EXTRACT'))).filter(
article__website=website,
hour=hour)
但这会导致错误“TypeError: expected string or bytes-like object”。我对如何指定我的 SQL 语句的“GROUP BY”部分感到困惑,然后我对如何返回我想要的两列数据感到困惑,因为我认为上面只返回 ArticleStat 对象,这不会t 包括我的平均水平。
【问题讨论】:
-
如果您对对象进行了注释,则这些对象确实包括平均值。如果您不需要对象而只需要两个字段,请使用values()。
-
哦,好的,如果它还包含我想要的新字段,我可以拥有该对象。但是,为什么我在上面得到“TypeError: expected string or bytes-like object”错误?
标签: python django python-3.x aggregate average