创建关于两个字段(跨越FK关系)的划分的查询

时间:2012-01-13 01:51:13

标签: sql django aggregate-functions

我有一个对象:

class Image(models.Model):
    width = models.IntegerField(...)
    height = models.IntegerField(...)

class Foo(models.Model):
    title = ...
    image = models.ForeignKey(Image ...)

我想尝试检索具有相似宽高比的相关图像的所有Foo个对象。在一个完美的世界中,像是:

ratio = width/height
min = ratio - 0.25
max = ratio + 0.25

similar = ImageMeta.objects \
              .annotate(ratio=Div('image__width', 'image__height')\
              .filter(ratio__gte=min).filter(ratio__lte=max)

但是没有这样的divison聚合函数。 This answer建议使用extra,即

.extra({ 'select' : 'width/height' )

但由于宽度和高度位于不同的表中,我不确定如何跨越关系(即编写SQL)来执行此操作。有人可以提供一些帮助吗?

1 个答案:

答案 0 :(得分:1)

考虑使用F() objects而不是聚合。

此查询乘以比率以在单个字段上进行直接比较:

Foo.objects.filter(image__width__gte=F('image__height') * min_ratio, 
                   image__width__lte=F('image__height') * max_ratio)