Django: фильтр по значению другой строки - PullRequest
1 голос
/ 06 ноября 2019

У меня есть модель Foo с полем value.

# models.py

class Foo(models.Model):
    value = models.IntegerField()

Теперь я хочу отфильтровать все Foo экземпляры, которые имеют value больше, чем Foo объект с определенным идентификатором knwon.

pk = 10
obj = Foo.objects.get(pk=pk)
qs = Foo.objects.filter(value__gte=obj.value)

Вопросмогу ли я как-то объединить два вышеупомянутых запроса к базе данных в один?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Вы можете сделать это с помощью подзапроса, хотя я не уверен, что это делает его очень читабельным:

Foo.objects.filter(
    value__gte=<b>Foo.objects.filter(pk=10).values('value')</b>
)

В результате запрос будет выглядеть так:

SELECT *
FROM foo
WHERE <b>foo.value >= (</b>
    SELECT U0.value
    FROM foo AS U0
    WHERE id = 10
<b>)</b>
0 голосов
/ 06 ноября 2019

Я не думаю, что вы можете, если не использовать сырой SQL (который я не компетентен писать). Сказав это, я полностью ожидаю, что кто-то покажет мне, что я не прав.

Я бы сказал, что не всегда стоит делать код менее понятным, чтобы сохранить один запрос к БД. Особенно простейший - получить один объект по его идентификатору. (Вы можете уменьшить нагрузку на соединение с базой данных и сервером Django, изменив его на запрос значений_100 *, и это не сделает код неясным, только дольше).

Вы можете использовать F (ссылка) для фильтрации путем сравнения одного поля в объекте с другим полем в том же или связанном объекте, но здесь это не так.

...