Django
RangeFields - un groupe de champs spécifiques à PostgreSQL
Recherche…
Syntaxe
- à partir de django.contrib.postgres.fields import * RangeField
- IntegerRangeField (** options)
- BigIntegerRangeField (options **)
- FloatRangeField (** options)
- DateTimeRangeField (options **)
- DateRangeField (** options)
Inclure des champs de plage numériques dans votre modèle
Il existe trois types de RangeField
numériques dans Python. IntegerField
, BigIntegerField
et FloatField
. Ils convertissent en psycopg2
NumericRange
s, mais acceptent les entrées en tant que tuples Python natifs. La limite inférieure est incluse et la limite supérieure est exclue.
class Book(models.Model):
name = CharField(max_length=200)
ratings_range = IntegerRange()
Mise en place pour RangeField
- Ajouter
'django.contrib.postgres'
à votreINSTALLED_APPS
- installez
psycopg2
Création de modèles avec des champs de plage numériques
Il est plus simple et facile de saisir des valeurs sous la forme d'un tuple Python au lieu d'un NumericRange
.
Book.objects.create(name='Pro Git', ratings_range=(5, 5))
Méthode alternative avec NumericRange
:
Book.objects.create(name='Pro Git', ratings_range=NumericRange(5, 5))
Utiliser contient
Cette requête sélectionne tous les livres avec une note inférieure à trois.
bad_books = Books.objects.filter(ratings_range__contains=(1, 3))
Utiliser contain_by
Cette requête obtient tous les livres avec des évaluations supérieures ou égales à zéro et inférieures à six.
all_books = Book.objects.filter(ratings_range_contained_by=(0, 6))
Utiliser le chevauchement
Cette requête obtient tous les rendez-vous qui se chevauchent de six à dix.
Appointment.objects.filter(time_span__overlap=(6, 10))
Utiliser None pour signifier aucune limite supérieure
Cette requête sélectionne tous les livres dont l’évaluation est supérieure ou égale à quatre.
maybe_good_books = Books.objects.filter(ratings_range__contains=(4, None))
Opérations de gammes
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)