注解Django查询集不使用后退外键返回注解。使用geodjango

问题描述 投票:0回答:1

我有一个神秘的问题,其中使用向后外键的注释不会出现在查询集上。使用Django 2.2。

模型

from django.contrib.gis.db import models

class Hexgrid_10km2(models.Model):
    polygon = gismodels.MultiPolygonField(srid=4326)


class Reply(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    reply_date = models.DateTimeField()
    ability = models.FloatField(default = 0)
    hexgrid_10km2 = models.ForeignKey(Hexgrid_10km2, related_name='replies', on_delete=models.CASCADE, null=True, blank=True)

问题

我首先将Hexgrid_10km2过滤为仅包含回复的内容:

most_recent = Reply.objects.filter(
    reply_date=Subquery(
        (Reply.objects
            .filter(user=OuterRef('user'))
            .values('user')
            .annotate(most_recent=Max('reply_date'))
            .values('reply_date')[:1]
        )
    )
)
hex_qs = Hexgrid_10km2.objects.filter(replies__in=most_recent)

>>> hex_qs
<QuerySet [<Hexgrid_10km2: Hexgrid_10km2 object (197028)>, <Hexgrid_10km2: Hexgrid_10km2 object (197028)>]>

我检查是否确实包含回复:

>>> hex_qs.aggregate(Sum('replies__ability'))
{'replies__ability__sum': 2.0}

现在是个谜...

>>> hex_qs.annotate(avg_ability=Avg('replies__ability'))
<QuerySet [<Hexgrid_10km2: Hexgrid_10km2 object (197028)>]>

注释在哪里?它与我用来建立模型的geodjango有关吗?我感觉像个傻瓜。非常感谢您的帮助,因为它完全卡住了。

python django geodjango
1个回答
0
投票

如果您.annotate(..),则将属性添加到由that查询集产生的对象。

[当Django打印查询集时,它利用.annotate(..)打印(第一个)对象。因此,这意味着除非实现repr(..)方法(或__repr__方法)以打印属性,否则它将不会显示。

因此,您可以例如通过以下方式访问第一个对象的注释:

__str__
© www.soinside.com 2019 - 2024. All rights reserved.