Аннотирующий Django набор запросов не возвращает аннотации с использованием обратного внешнего ключа. Использование геоджанго - PullRequest
0 голосов
/ 16 апреля 2020

У меня загадочная проблема, когда аннотации не отображаются в наборе запросов с использованием обратного внешнего ключа. Использование 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)>]>

Где аннотация? Это как-то связано с geo django, который я использую для построения моделей? Я чувствую себя как дурак. Большое спасибо за вашу помощь, так как я застрял.

1 Ответ

1 голос
/ 17 апреля 2020

Если вы .annotate(..), то вы добавляете атрибут к объектам, которые возникают из этого queryset.

Когда Django печатает набор запросов, он использует repr(..) для печати (первых) объектов. Таким образом, это означает, что если метод __repr__ (или метод __str__) не будет реализован для печати атрибутов, он не будет отображаться.

Таким образом, вы можете, например, получить доступ к аннотации первого объекта с помощью:

hex_qs[0]<b>.avg_ability</b>
...