gpt4 book ai didi

python - 在 django 中使用 annotate 引用相关对象

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:06 25 4
gpt4 key购买 nike

与看起来应该是一个简单问题的问题进行一些斗争......

基本上我有一些网站,其中对象的计数发生在几年内:

例子:

site_id = Site1: (Year:2012,Count:133), (Year:2011, Count:150), (Year:2010, Count :110)
site_id = Site2: (Year:2010, Count:300), (Year:2010, Count 333)

数据在时间上是零散的(不规则 - 一些网站在几年内被统计过......其他的则没有......)..另外,有时这些地方一年被统计了几次

我想做的是获取每个站点的最新计数,如果有多个计数,我想获取最高计数。然后我想用 HTML 显示它。

这是我的模型.PY

class Counts(models.Model):
count_id = models.AutoField(primary_key=True)
site = models.ForeignKey('Site', blank=True, null=True)
year = models.IntegerField(blank=True, null=True)
count = models.FloatField(blank=True, null=True)

class Meta:
db_table = 'counts'


class Site(models.Model):
site_id = models.TextField(primary_key=True)
site_code = models.TextField(blank=True, null=True)
site_name = models.TextField(blank=True, null=True)

class Meta:
db_table = 'site'

这是我试图在 VIEWS.PY 中使用的查询

p = ['Site1','Site2']  ## Just for reference for the example... values come from a POST or a GET

A = Site.objects.filter(site_id__in = p).annotate(latest=Max('counts__year'))

context = RequestContext(request, {'dat':A})
template = loader.get_template('styles/searchResults.html')
return HttpResponse(template.render(context))

上面只给我最近几年的:

[{'site_id': u'Site1','latest': 2012}, {'site_id': u'Site2','latest': 2010}]

我想要的是:

[{'site_id': u'Site1','latest': 2012,'count':133}, {'site_id': u'Site2','latest': 2010,'count':333}]

但是 - 我希望它作为 QuerySet(而不是 ValuesQuerySet),因为我想在我的 HTML 模板中引用它,如下所示:

<table>
{% for x in dat %}
<tr><td>{{x.count|floatformat}}</td><td>{{x.year}}</tr>
{%endfor%}
</table>

我尝试了以下方法(从上面创建 A 之后): B = Counts.objects.filter(year__in = A.values('latest'),site__site_id__in = p).annotate(site_code=Max('site__site_id'))

但这基本上导致:

[{'site_id': u'Site1','latest': 2012,'count':133},{'site_id': u'Site1','latest': 2010,'count':110}, {'site_id': u'Site2','latest': 2010,'count':333},{'site_id': u'Site2','latest': 2010,'count':300}]

换句话说,它会提取两个站点的 YEAR = 2010 OR 2012 的所有值。

同样,我正在寻找的是最近 年的最高计数。 Max(count), Max(year) - 我确信它以某种方式发挥作用......

谢谢!

最佳答案

如何按年排序并计数并使用 .distinct() 只获取每个站点的第一条记录?

A = Counts.objects.filter(site_id__in = p).order_by('site_id','-year','-count').distinct('site_id')

如果您需要相应的网站信息,可以在模板中访问

<table>
{% for x in dat %}
<tr><td>{{x.count|floatformat}}</td><td>{{x.year}}</td><td>{{x.site.site_name}}</td></tr>
{%endfor%}
</table>

或使用 .values() 指定 View 中每个模型的值。结果也是在模板中可迭代的。

关于python - 在 django 中使用 annotate 引用相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com