通过反向关系注释Django查询

Gar*_*ers 5 python django django-queryset

我有两个模型,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
Run Code Online (Sandbox Code Playgroud)

我遵循此处发布的答案:跨反向关系的Django聚合,因为我认为这是一个类似的问题,但是我发现它返回一个空的查询集。

感谢您提供任何帮助。

编辑:

我运行的查询是:

Property.objects.all().annotate(image_count=Count('image')).order_by('-image_count')
Run Code Online (Sandbox Code Playgroud)

编辑2:

经过一些试验后,我找到了解决方案,尽管我很确定这可以视为错误/未记录的问题:

Property.objects.all().annotate(Count('image')).order_by('-image__count')
Property.objects.all().annotate(total_images=Count('image')).order_by('-total_images')
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 5

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

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