Создайте запрос на разделение двух полей (которые охватывают отношение FK) - PullRequest
0 голосов
/ 13 января 2012

У меня есть объект:

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)

, но такой функции агрегации делений не существует. В этом ответе предлагается использовать extra, т.е.

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

, но поскольку ширина и высота находятся в другой таблице, я не уверен, как охватить взаимосвязь (т.е. написатьSQL), чтобы сделать это.Может ли кто-нибудь предложить некоторую помощь?

1 Ответ

1 голос
/ 13 января 2012

Рассмотрите возможность использования F () объектов вместо агрегирования.

Этот запрос умножается на коэффициент для прямого сравнения по одному полю:

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