Django
RangeFields - grupa pól specyficznych dla PostgreSQL
Szukaj…
Składnia
- z importu django.contrib.postgres.fields * RangeField
- IntegerRangeField (** opcje)
- BigIntegerRangeField (** opcje)
- FloatRangeField (** opcje)
- DateTimeRangeField (** opcje)
- DateRangeField (** opcje)
W tym numeryczne pola zakresu w twoim modelu
Istnieją trzy rodzaje numerycznych RangeField
w Pythonie. IntegerField
, BigIntegerField
i FloatField
. Konwertują na psycopg2
NumericRange
, ale akceptują dane wejściowe jako rodzime krotki Pythona. Dolna granica jest uwzględniona, a górna granica jest wykluczona.
class Book(models.Model):
name = CharField(max_length=200)
ratings_range = IntegerRange()
Konfiguracja RangeField
- dodaj
'django.contrib.postgres'
do swojegoINSTALLED_APPS
- zainstaluj
psycopg2
Tworzenie modeli z numerycznymi polami zakresu
Prostsze i łatwiejsze jest wprowadzanie wartości jako krotki Python zamiast NumericRange
.
Book.objects.create(name='Pro Git', ratings_range=(5, 5))
Alternatywna metoda z NumericRange
:
Book.objects.create(name='Pro Git', ratings_range=NumericRange(5, 5))
Korzystanie zawiera
To zapytanie wybiera wszystkie książki o dowolnej ocenie mniejszej niż trzy.
bad_books = Books.objects.filter(ratings_range__contains=(1, 3))
Korzystanie z zawartych_przez
To zapytanie powoduje, że wszystkie książki z ocenami większymi lub równymi zero i mniejszymi niż sześć.
all_books = Book.objects.filter(ratings_range_contained_by=(0, 6))
Korzystanie z nakładania się
To zapytanie powoduje, że wszystkie nakładające się spotkania są od sześciu do dziesięciu.
Appointment.objects.filter(time_span__overlap=(6, 10))
Użycie None oznacza brak górnej granicy
To zapytanie wybiera wszystkie książki o dowolnej ocenie większej lub równej czterech.
maybe_good_books = Books.objects.filter(ratings_range__contains=(4, None))
Zakresy operacji
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)