Django
RangeFields - en grupp PostgreSQL-specifika fält
Sök…
Syntax
- från django.contrib.postgres.fields import * RangeField
- IntegerRangeField (** optioner)
- BigIntegerRangeField (** optioner)
- FloatRangeField (** optioner)
- DateTimeRangeField (** optioner)
- DateRangeField (** optioner)
Inklusive numeriska intervallfält i din modell
Det finns tre typer av numeriska RangeField
i Python. IntegerField
, BigIntegerField
och FloatField
. De konverterar till psycopg2
NumericRange
s, men accepterar input som infödda Python-tuples. Den nedre gränsen är inkluderad och den övre gränsen är utesluten.
class Book(models.Model):
name = CharField(max_length=200)
ratings_range = IntegerRange()
Ställa in för RangeField
- lägg till
'django.contrib.postgres'
till dinaINSTALLED_APPS
- installera
psycopg2
Skapa modeller med numeriska intervallfält
Det är enklare och lättare att mata in värden som en Python-tupel istället för en NumericRange
.
Book.objects.create(name='Pro Git', ratings_range=(5, 5))
Alternativ metod med NumericRange
:
Book.objects.create(name='Pro Git', ratings_range=NumericRange(5, 5))
Användning innehåller
Den här frågan väljer alla böcker med någon klassificering mindre än tre.
bad_books = Books.objects.filter(ratings_range__contains=(1, 3))
Med hjälp av contain_by
Denna fråga får alla böcker med betyg högre än eller lika med noll och mindre än sex.
all_books = Book.objects.filter(ratings_range_contained_by=(0, 6))
Använd överlappning
Denna fråga får alla överlappande möten från sex till tio.
Appointment.objects.filter(time_span__overlap=(6, 10))
Använd ingen för att markera ingen övre gräns
Denna fråga väljer alla böcker med någon betyg högre än eller lika med fyra.
maybe_good_books = Books.objects.filter(ratings_range__contains=(4, None))
Räckvidd
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow