A pythonic way to do this would be extremely useful if it existed. As you
suggested, I did this using a sql exclusion constraint statement on the
table and a migration.
For example:
000x_your_migration_name.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
SQL = """ALTER TABLE your_table DROP CONSTRAINT IF EXISTS
range_overlap_exclusion;
ALTER TABLE your_table ADD CONSTRAINT range_overlap_exclusion
EXCLUDE USING gist (resource WITH =, date_range WITH &&);"""
class Migration(migrations.Migration):
dependencies = [
('module_name', '000x_previous_migration'),
]
operations = [migrations.RunSQL(sql=SQL,
reverse_sql=migrations.RunSQL.noop), ]
On Sunday, October 1, 2017 at 11:53:53 PM UTC+2, Brylie Christopher Oxley
wrote:
>
> Now that Django supports the DateRangeField, is there a 'Pythonic' way to
> prevent records from having overlapping date ranges?
>
> # Hypothetical use case
> One hypothetical use case would be a booking system, where you don't want
> people to book the same resource at the same time.
>
> # Hypothetical example code
> <!-- language: lang-py -->
>
> class Booking(models.model):
> # The resource to be reserved
> resource = models.ForeignKey('Resource')
> # When to reserve the resource
> date_range = models.DateRangeField()
>
> class Meta:
> unique_together = ('resource', 'date_range',)
>
> This might have the effect of adding an exclusion constraint on the
> underlying table:
>
> https://www.postgresql.org/docs/9.3/static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
> --
> Sent from my Android device with K-9 Mail. Please excuse my brevity.
--
You received this message because you are subscribed to the Google Groups
"Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/f595965d-8646-40f8-8637-f5011ba8f535%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.