Django
RangeFields - un grupo de campos específicos de PostgreSQL
Buscar..
Sintaxis
- desde django.contrib.postgres.fields import * RangeField
- IntegerRangeField (** opciones)
- BigIntegerRangeField (** opciones)
- FloatRangeField (** opciones)
- DateTimeRangeField (** opciones)
- DateRangeField (** opciones)
Incluyendo campos de rango numérico en su modelo
Hay tres tipos de RangeField
numérico en Python. IntegerField
, BigIntegerField
y FloatField
. Se convierten a psycopg2
NumericRange
s, pero aceptan entradas como tuplas nativas de Python. Se incluye el límite inferior y se excluye el límite superior.
class Book(models.Model):
name = CharField(max_length=200)
ratings_range = IntegerRange()
Configurando para RangeField
- agregue
'django.contrib.postgres'
a suINSTALLED_APPS
- instalar
psycopg2
Creando modelos con campos de rango numérico
Es más simple y más fácil ingresar valores como una tupla de Python en lugar de un NumericRange
.
Book.objects.create(name='Pro Git', ratings_range=(5, 5))
Método alternativo con NumericRange
:
Book.objects.create(name='Pro Git', ratings_range=NumericRange(5, 5))
Usando contiene
Esta consulta selecciona todos los libros con cualquier calificación inferior a tres.
bad_books = Books.objects.filter(ratings_range__contains=(1, 3))
Usando contenido_por
Esta consulta obtiene todos los libros con calificaciones mayores o iguales a cero y menores a seis.
all_books = Book.objects.filter(ratings_range_contained_by=(0, 6))
Usando superposición
Esta consulta obtiene todas las citas superpuestas de seis a diez.
Appointment.objects.filter(time_span__overlap=(6, 10))
Usando Ninguno para significar que no hay límite superior
Esta consulta selecciona todos los libros con una calificación mayor o igual a cuatro.
maybe_good_books = Books.objects.filter(ratings_range__contains=(4, None))
Rangos de operaciones
from datetime import timedelta
from django.utils import timezone
from psycopg2.extras import DateTimeTZRange
# To create a "period" object we will use psycopg2's DateTimeTZRange
# which takes the two datetime bounds as arguments
period_start = timezone.now()
period_end = period_start + timedelta(days=1, hours=3)
period = DateTimeTZRange(start, end)
# Say Event.timeslot is a DateTimeRangeField
# Events which cover at least the whole selected period,
Event.objects.filter(timeslot__contains=period)
# Events which start and end within selected period,
Event.objects.filter(timeslot__contained_by=period)
# Events which, at least partially, take place during the selected period.
Event.objects.filter(timeslot__overlap=period)
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow