Сравнение столбцов в запросах Django - PullRequest
12 голосов
/ 11 января 2009

У меня есть следующая модель:

class Car(models.Model):
    make = models.CharField(max_length=40)
    mileage_limit = models.IntegerField()
    mileage = models.IntegerField()

Я хочу выбрать все автомобили, у которых пробег меньше, чем micycle_limit, поэтому в SQL это будет выглядеть примерно так:

select * from car where mileage < mileage_limit;

Используя объект Q в Django, я знаю, что могу сравнивать столбцы с любым значением / объектом, например, если бы я хотел получить автомобили с пробегом менее 100 000, это было бы что-то вроде:

cars = Car.objects.filter(Q(mileage__lt=100000))

Вместо фиксированного значения я хотел бы использовать имя столбца (в моем случае это micycle_limit). Поэтому я хотел бы иметь возможность сделать что-то вроде:

cars = Car.objects.filter(Q(mileage__lt=mileage_limit))

Однако это приводит к ошибке, так как он ожидает значение / объект, а не имя столбца. Есть ли способ сравнить два столбца, используя объект Q? Я чувствую, что это будет очень часто используемая функция, и должен быть простой способ сделать это, однако ничего не могу найти в документации.

Примечание: это упрощенный пример, для которого использование объекта Q может показаться ненужным. Однако реальная модель имеет гораздо больше столбцов, а реальный запрос более сложный, поэтому я использую Q. Здесь в этом вопросе я просто хотел выяснить, как конкретно сравнивать столбцы с использованием Q. EDIT

По-видимому, после выпуска Django 1.1 можно будет сделать следующее:

cars = Car.objects.filter(mileage__lt=F('mileage_limit'))

Все еще не уверен, должен ли F работать вместе с Q следующим образом:

cars = Car.objects.filter(Q(mileage__lt=F('mileage_limit')))

1 Ответ

8 голосов
/ 11 января 2009

Вы не можете сделать это прямо сейчас без специального SQL. Разработчики django работают над функцией F (), которая сделала бы возможным: # 7210 - F () синтаксис, требуется обратная связь для проектирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...