Django
RangeFields - een groep PostgreSQL-specifieke velden
Zoeken…
Syntaxis
- van django.contrib.postgres.fields import * RangeField
- IntegerRangeField (** opties)
- BigIntegerRangeField (** opties)
- FloatRangeField (** opties)
- DateTimeRangeField (** opties)
- DateRangeField (** opties)
Numerieke bereikvelden in uw model opnemen
Er zijn drie soorten numerieke RangeField
s in Python. IntegerField
, BigIntegerField
en FloatField
. Ze converteren naar psycopg2
NumericRange
s, maar accepteren invoer als native Python-tupels. De ondergrens is opgenomen en de bovengrens is uitgesloten.
class Book(models.Model):
name = CharField(max_length=200)
ratings_range = IntegerRange()
Instellen voor RangeField
- voeg
'django.contrib.postgres'
aan uwINSTALLED_APPS
- installeer
psycopg2
Modellen maken met numerieke bereikvelden
Het is eenvoudiger en gemakkelijker om waarden in te voeren als een Python-tuple in plaats van een NumericRange
.
Book.objects.create(name='Pro Git', ratings_range=(5, 5))
Alternatieve methode met NumericRange
:
Book.objects.create(name='Pro Git', ratings_range=NumericRange(5, 5))
Gebruik bevat
Deze zoekopdracht selecteert alle boeken met een beoordeling lager dan drie.
bad_books = Books.objects.filter(ratings_range__contains=(1, 3))
Contain_by gebruiken
Met deze zoekopdracht worden alle boeken met beoordelingen groter dan of gelijk aan nul en kleiner dan zes opgehaald.
all_books = Book.objects.filter(ratings_range_contained_by=(0, 6))
Overlap gebruiken
Deze query krijgt alle overlappende afspraken van zes tot tien.
Appointment.objects.filter(time_span__overlap=(6, 10))
Geen gebruiken om geen bovengrens aan te geven
Deze zoekopdracht selecteert alle boeken met een beoordeling groter dan of gelijk aan vier.
maybe_good_books = Books.objects.filter(ratings_range__contains=(4, None))
Bereik operaties
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)