<<- Subscribe and follow { }

F выражение в Django ORM

Ali Aliev [2015-06-03]

Выражение F() в Django ORM позволит вам использовать поля текущей модели в ваших запросах. Например, вы хотите увеличить значение поля на единицу, на ум приходит следующий код:

article = Article.objects.get(pk=1)
article.count += 1
article.save()

Но данный код можно реализовать более элегантным способом:

Article.objects.filter(pk=1).update(count=F('count') + 5)

Более практичный пример, сравнивать поля текущей модели.

In [2]: Article.objects.create(count=1, number_of_likes=10)
Out[2]: <Article: Article object>

Попробуем сделать сравнение

In [3]: from django.db.models import F

In [4]: Article.objects.filter(number_of_likes__gte=F('count'))
Out[4]: [<Article: Article object>]

Посмотрим какой SQL запрос был сгенерирован

In [5]: print Article.objects.filter(number_of_likes__gte=F('count')).query
SELECT "example_article"."id", "example_article"."content", "example_article"."count", "example_article"."number_of_likes" FROM "example_article" WHERE "example_article"."number_of_likes" >= ("example_article"."count")

Если вам интересно узнать как работают F выражения изнутри советую прочитать старенькую статью Ивана Сагалаева.