【问题标题】:Annotate a django query via a reverse relationship通过反向关系注释 django 查询
【发布时间】:2011-03-23 03:28:38
【问题描述】:

我有两个模型Property 和Image,通过外键关联,每个Property 都有多个Image 实例。我正在尝试检索所有属性的查询集 - 列出所有字段 - 以及每个属性具有的图像数量。我知道我可以将这作为两个不同的查询来执行,但我不觉得这是一种特别优雅的方法,并且证明效率有点低,因为通过 XMLHttpRequest 检索此信息。

模型定义如下:

class Property(models.Model):
    title = models.CharField('title', max_length=255)
    created = models.DateTimeField('created', auto_now_add=True)
    modified = models.DateTimeField('modified', auto_now=True)

    class Meta:
        pass


class Image(models.Model):
    prop_id = models.ForeignKey(Property)
    image_file = models.ImageField('image file', upload_to='/path/to/image/')

    class Meta:
        pass

我已按照此处发布的答案进行操作:Django Aggregation Across Reverse Relationship,因为我相信这是一个类似的问题,但我发现这会返回一个空查询集。

感谢任何人提供的任何帮助。

编辑:

我运行的查询是:

Property.objects.all().annotate(image_count=Count('image')).order_by('-image_count')

编辑 2:

经过一些实验,我找到了解决方案,尽管我很确定这属于错误/未记录的问题:

Property.objects.all().annotate(Count('image')).order_by('-image__count')
Property.objects.all().annotate(total_images=Count('image')).order_by('-total_images')

这两种方法都有效,但将注解命名为 image_count 却没有。如果不深入研究 Django 源代码,我无法真正推测为什么会发生这种情况。

【问题讨论】:

  • 我对该问题的回答(或另一个)应该有效。你能发布你运行的确切代码吗?

标签: python django django-queryset


【解决方案1】:

您发布的代码应该可以工作 - 在任何情况下,它都不应返回空查询集,因为 annotate 不会影响主查询的过滤。

愚蠢的问题,但你确定数据库中有 Property 元素吗?

【讨论】:

  • 大约 200 个,以及将近 9000 个图像对象,所以我不确定这里发生了什么。
  • 接受,因为您的回答(关于另一个问题)是正确的,并且让我走上了正轨。谢谢。
猜你喜欢
  • 2010-11-03
  • 2019-11-06
  • 1970-01-01
  • 2016-09-22
  • 2019-05-18
  • 2023-03-09
  • 1970-01-01
  • 2022-01-22
  • 2012-11-18
相关资源
最近更新 更多