Python django range это

Range Fields

Существует пять типов полей диапазона,соответствующих встроенным типам диапазонов в PostgreSQL.Эти поля используются для хранения диапазона значений,например,метки времени начала и окончания события,или диапазона возрастов,для которых подходит то или иное мероприятие.

Все поля диапазона преобразуются в объекты диапазона psycopg2 в Python, но также принимают кортежи в качестве входных данных, если информация о границах не требуется. По умолчанию нижняя граница включена, верхняя граница исключена, то есть [) (подробности о различных границах см. в документации PostgreSQL ). Границы по умолчанию можно изменить для недискретных полей диапазона ( DateTimeRangeField и DecimalRangeField ) с помощью аргумента default_bounds .

IntegerRangeField

Сохраняет диапазон целых чисел. На основе IntegerField . Представлен int4range в базе данных и NumericRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

BigIntegerRangeField

Сохраняет диапазон больших целых чисел. На основе BigIntegerField . Представлен int8range в базе данных и NumericRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

DecimalRangeField

Сохраняет диапазон значений с плавающей запятой. На основе DecimalField . Представлен numrange в базе данных и NumericRange в Python.

По желанию. Значение bounds для входных данных списка и кортежа. По умолчанию нижняя граница включена, верхняя граница исключена, то есть [) (подробности о различных границах см. в документации PostgreSQL ). default_bounds не используется для входных данных NumericRange .

DateTimeRangeField

Сохраняет диапазон временных меток. На основе DateTimeField . Представлен tstzrange в базе данных и DateTimeTZRange в Python.

По желанию. Значение bounds для входных данных списка и кортежа. По умолчанию нижняя граница включена, верхняя граница исключена, то есть [) (подробности о различных границах см. в документации PostgreSQL ). default_bounds не используется для входных данных DateTimeTZRange .

DateRangeField

Сохраняет диапазон дат. На основе DateField . Представлен daterange в базе данных и DateRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

Поля диапазона запросов

Существует ряд пользовательских поисков и трансформаций для диапазона полей.Они доступны для всех вышеуказанных полей,но мы будем использовать следующий пример модели:

from django.contrib.postgres.fields import IntegerRangeField from django.db import models class Event(models.Model): name = models.CharField(max_length=200) ages = IntegerRangeField() start = models.DateTimeField() def __str__(self): return self.name

Мы также будем использовать следующие примеры объектов:

>>> import datetime >>> from django.utils import timezone >>> now = timezone.now() >>> Event.objects.create(name='Soft play', ages=(0, 10), start=now) >>> Event.objects.create(name='Pub trip', ages=(21, None), start=now - datetime.timedelta(days=1)) 
>>> from psycopg2.extras import NumericRange 

Containment functions

Как и в других областях PostgreSQL, есть три стандартные операторы сдерживания: contains , contained_by и overlap , с помощью операторов SQL @> ,

Читайте также:  Python function with return values
contains
>>> Event.objects.filter(ages__contains=NumericRange(4, 5)) ]>
contained_by
>>> Event.objects.filter(ages__contained_by=NumericRange(0, 15)) ]>

Поиск contains_by также доступен для типов полей, не относящихся к диапазону SmallAutoField contained_by , AutoField , BigAutoField , SmallIntegerField , IntegerField , BigIntegerField , DecimalField , FloatField , DateField и DateTimeField . Например:

>>> from psycopg2.extras import DateTimeTZRange >>> Event.objects.filter( . start__contained_by=DateTimeTZRange( . timezone.now() - datetime.timedelta(hours=1), . timezone.now() + datetime.timedelta(hours=1), . ), . ) ]>
overlap
>>> Event.objects.filter(ages__overlap=NumericRange(8, 12)) ]>

Comparison functions

Поля диапазона поддерживают стандартный поиск: lt , gt , lte и gte . Это не особенно полезно — они сначала сравнивают нижние границы, а затем верхние границы, только если это необходимо. Это также стратегия, используемая для упорядочения по полю диапазона. Лучше использовать специальные операторы сравнения диапазонов.

fully_lt

Возвращаемые диапазоны строго меньше пройденного диапазона.Другими словами,все точки возвращаемого диапазона меньше,чем все точки переданного диапазона.

>>> Event.objects.filter(ages__fully_lt=NumericRange(11, 15)) ]>
fully_gt

Возвращаемые диапазоны строго превышают пройденный диапазон.Другими словами,все точки возвращаемого диапазона больше,чем все точки переданного диапазона.

>>> Event.objects.filter(ages__fully_gt=NumericRange(11, 15)) ]>
not_lt

Возвращаемые диапазоны не содержат ни одной точки меньше переданного диапазона,т.е.нижняя граница возвращаемого диапазона является,по крайней мере,нижней границей переданного диапазона.

>>> Event.objects.filter(ages__not_lt=NumericRange(0, 15)) , ]>
not_gt

Возвращаемые диапазоны не содержат точек,превышающих пройденный диапазон,т.е.верхняя граница возвращаемого диапазона находится максимум в верхней границе пройденного диапазона.

>>> Event.objects.filter(ages__not_gt=NumericRange(3, 10)) ]>
adjacent_to

Возвращаемые диапазоны имеют общую границу с переданным диапазоном.

>>> Event.objects.filter(ages__adjacent_to=NumericRange(10, 21)) , ]>

Запрос с использованием границ

Поля диапазона поддерживают несколько дополнительных поисков.

startswith

Возвращаемые объекты имеют заданный нижний предел.Может быть прикован к действительному поиску базового поля.

>>> Event.objects.filter(ages__startswith=21) ]>
endswith

Возвращаемые объекты имеют заданную верхнюю границу.Может быть прикован к действительному поиску базового поля.

>>> Event.objects.filter(ages__endswith=10) ]>
isempty

Возвращаемые объекты представляют собой пустые диапазоны. Может быть привязан к действительным BooleanField .

>>> Event.objects.filter(ages__isempty=True)

lower_inc

Возвращает объекты, имеющие включающие или исключающие нижние границы, в зависимости от переданного логического значения. Может быть привязан к действительным BooleanField .

>>> Event.objects.filter(ages__lower_inc=True) , ]>
lower_inf

Возвращает объекты с неограниченной (бесконечной) или ограниченной нижней границей, в зависимости от переданного логического значения. Может быть привязан к действительным BooleanField .

Читайте также:  Php service error module

>>> Event.objects.filter(ages__lower_inf=True)

upper_inc

Возвращает объекты, имеющие включающие или исключающие верхние границы, в зависимости от переданного логического значения. Может быть привязан к действительным BooleanField .

>>> Event.objects.filter(ages__upper_inc=True)

upper_inf

Возвращает объекты с неограниченной (бесконечной) или ограниченной верхней границей в зависимости от переданного логического значения. Может быть привязан к действительным BooleanField .

>>> Event.objects.filter(ages__upper_inf=True) ]>

Определение собственных типов диапазона

PostgreSQL позволяет определять пользовательские типы диапазонов. Реализации модели и поля формы Django используют базовые классы ниже, а psycopg2 предоставляет register_range() , чтобы разрешить использование настраиваемых типов диапазонов.

Базовый класс для полей модельного ряда.

Класс поля модели для использования.

Тип диапазона psycopg2 для использования.

Используемый класс поля формы. Должен быть подклассом django.contrib.postgres.forms.BaseRangeField .

Базовый класс для полей диапазона форм.

Поле формы для использования.

Тип диапазона psycopg2 для использования.

Range operators

PostgreSQL предоставляет набор операторов SQL, которые можно использовать вместе с типами данных диапазона ( подробные сведения об операторах диапазона см. В документации PostgreSQL ). Этот класс предназначен как удобный метод, чтобы избежать опечаток. Имена операторов пересекаются с именами соответствующих поисков.

class RangeOperators: EQUAL = '=' NOT_EQUAL = '<>' CONTAINS = '@>' CONTAINED_BY = ' OVERLAPS = '&&' FULLY_LT = ' FULLY_GT = '>>' NOT_LT = '&>' NOT_GT = '& ADJACENT_TO = '-|-' 

RangeBoundary() expressions

Если True (по умолчанию), нижняя граница включает ‘[‘ , в противном случае она исключает ‘(‘ .

Если False (по умолчанию), верхняя граница является исключающей ‘)’ , в противном случае она включает ‘]’ .

RangeBoundary() выражение представляет границы диапазона. Его можно использовать с пользовательскими функциями диапазона, которые ожидают границы, например, для определения ExclusionConstraint . Смотрите подробности в документации PostgreSQL .

Источник

Django range

Summary: in this tutorial, you’ll learn how to use the Django range to check if a value is between two values.

A quick introduction to SQL BETWEEN operator

In SQL, you use the BETWEEN operator to check if a value is between two values:

field_name BETWEEN low_value AND high_valueCode language: Python (python)

It’s equivalent to the following:

field_name >= low_value AND field_name Code language: Python (python)

The BETWEEN operator returns true if the field_name is between low_value and high_value . Otherwise, it returns False.

Using Django range with numbers

Django’s equivalent of the BETWEEN operator is range:

Entity.objects.filter(field_name__range=(low_value,high_value))Code language: Python (python)

For example, you can find employees whose id is between 1 and 5 using the range like this:

>>> Employee.objects.filter(id__range=(1,5))Code language: Python (python)

Behind the scenes, Django executes the following query:

SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE "hr_employee"."id" BETWEEN 1 AND 5Code language: SQL (Structured Query Language) (sql)

Using Django range with dates

Besides numbers and strings, the range also works with dates. For example, the following return all job assignments starting from January 1, 2020 , to March 31, 2020 :

>>> Assignment.objects.filter(begin_date__range=(start_date,end_date)) SELECT "hr_assignment"."id", "hr_assignment"."employee_id", "hr_assignment"."job_id", "hr_assignment"."begin_date", "hr_assignment"."end_date" FROM "hr_assignment" WHERE "hr_assignment"."begin_date" BETWEEN '2020-01-01'::date AND '2020-03-31'::dateCode language: SQL (Structured Query Language) (sql)

NOT BETWEEN

The NOT operator negates the BETWEEN operator:

field_name NOT BETWEEN (low_value, high_value)

In other words, the NOT BETWEEN returns true if a value is not in a range of values. It is equivalent to the following:

field_name < low_value OR field_value >high_valueCode language: Python (python)

In Django, you can use the Q object with the range to check if a value is not in a range:

Entity.objects.filter(~Q(field_name__range=(low_value,high_value)))Code language: Python (python)

For example, you can find employees with the id are not in the range (1,5):

>>> Employee.objects.filter(~Q(id__range=(1,5))) SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE NOT ("hr_employee"."id" BETWEEN 1 AND 5)Code language: SQL (Structured Query Language) (sql)

Summary

Источник

Field Lookups - range

The range lookup is used to get records that are between two values.

The field can be of any type, numeric string or dates.

Example

Get all records where firstname is alphanumeric between 'G' and 'M':

mydata = Member.objects.filter(firstname__range=('G', 'M')).values() 

Note: When searching in text fields, remember that 'G' has a lower alphanumeric value than 'g'.

SQL Equivalent

The SQL equivalent to the two example above will be:

Syntax

All Field lookup keywords must be specified with the fieldname, followed by two(!) underscore characters __ and the keyword:

Unlock Full Access 50% off

COLOR PICKER

colorpicker

Join our Bootcamp!

Report Error

If you want to report an error, or if you want to make a suggestion, do not hesitate to send us an e-mail:

Thank You For Helping Us!

Your message has been sent to W3Schools.

Top Tutorials
Top References
Top Examples
Get Certified

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Источник

Оцените статью