使用向后外键注释 Django 查询集不返回注释。使用 geodjango
Annotating Django queryset not returning annotations using backwards foreign key. Using geodjango
我有一个神秘的问题,使用向后外键的查询集上没有显示注释。使用 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 有关系吗?
我觉得自己像个傻瓜。非常感谢您的帮助,因为我完全卡住了。
如果你 .annotate(..)
那么你会向 that 查询集产生的对象添加一个属性。
当 Django 打印查询集时,它使用 repr(..)
打印(第一个)对象。所以这意味着除非实现 __repr__
方法(或 __str__
方法)来打印属性,否则它不会显示。
例如,您可以通过以下方式访问第一个对象的注释:
hex_qs[0]<b>.avg_ability</b>
我有一个神秘的问题,使用向后外键的查询集上没有显示注释。使用 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 有关系吗? 我觉得自己像个傻瓜。非常感谢您的帮助,因为我完全卡住了。
如果你 .annotate(..)
那么你会向 that 查询集产生的对象添加一个属性。
当 Django 打印查询集时,它使用 repr(..)
打印(第一个)对象。所以这意味着除非实现 __repr__
方法(或 __str__
方法)来打印属性,否则它不会显示。
例如,您可以通过以下方式访问第一个对象的注释:
hex_qs[0]<b>.avg_ability</b>