mirror of
https://github.com/django/django.git
synced 2024-12-30 13:05:45 +00:00
39d95fb6ad
Several issues resolved here, following from a report that a base_field of GenericIpAddressField was failing. We were using get_prep_value instead of get_db_prep_value in ArrayField which was bypassing any extra modifications to the value being made in the base field's get_db_prep_value. Changing this broke datetime support, so the postgres backend has gained the relevant operation methods to send dates/times/datetimes directly to the db backend instead of casting them to strings. Similarly, a new database feature has been added allowing the uuid to be passed directly to the backend, as we do with timedeltas. On the other side, psycopg2 expects an Inet() instance for IP address fields, so we add a value_to_db_ipaddress method to wrap the strings on postgres. We also have to manually add a database adapter to psycopg2, as we do not wish to use the built in adapter which would turn everything into Inet() instances. Thanks to smclenithan for the report.
132 lines
5.4 KiB
Python
132 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
|
|
from django.db import models, migrations
|
|
import django.contrib.postgres.fields
|
|
import django.contrib.postgres.fields.hstore
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('postgres_tests', '0001_setup_extensions'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='CharArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', django.contrib.postgres.fields.ArrayField(models.CharField(max_length=10), size=None)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='DateTimeArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('datetimes', django.contrib.postgres.fields.ArrayField(models.DateTimeField(), size=None)),
|
|
('dates', django.contrib.postgres.fields.ArrayField(models.DateField(), size=None)),
|
|
('times', django.contrib.postgres.fields.ArrayField(models.TimeField(), size=None)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='HStoreModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', django.contrib.postgres.fields.hstore.HStoreField(blank=True, null=True)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='OtherTypesArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('ips', django.contrib.postgres.fields.ArrayField(models.GenericIPAddressField(), size=None)),
|
|
('uuids', django.contrib.postgres.fields.ArrayField(models.UUIDField(), size=None)),
|
|
('decimals', django.contrib.postgres.fields.ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='IntegerArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='NestedIntegerArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', django.contrib.postgres.fields.ArrayField(django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None), size=None)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='NullableIntegerArrayModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None, null=True, blank=True)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
migrations.CreateModel(
|
|
name='CharFieldModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', models.CharField(max_length=16)),
|
|
],
|
|
options=None,
|
|
bases=None,
|
|
),
|
|
migrations.CreateModel(
|
|
name='TextFieldModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('field', models.TextField()),
|
|
],
|
|
options=None,
|
|
bases=None,
|
|
),
|
|
]
|
|
|
|
pg_92_operations = [
|
|
migrations.CreateModel(
|
|
name='RangesModel',
|
|
fields=[
|
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
|
('ints', django.contrib.postgres.fields.IntegerRangeField(null=True, blank=True)),
|
|
('bigints', django.contrib.postgres.fields.BigIntegerRangeField(null=True, blank=True)),
|
|
('floats', django.contrib.postgres.fields.FloatRangeField(null=True, blank=True)),
|
|
('timestamps', django.contrib.postgres.fields.DateTimeRangeField(null=True, blank=True)),
|
|
('dates', django.contrib.postgres.fields.DateRangeField(null=True, blank=True)),
|
|
],
|
|
options={
|
|
},
|
|
bases=(models.Model,),
|
|
),
|
|
]
|
|
|
|
def apply(self, project_state, schema_editor, collect_sql=False):
|
|
PG_VERSION = schema_editor.connection.pg_version
|
|
if PG_VERSION >= 90200:
|
|
self.operations = self.operations + self.pg_92_operations
|
|
return super(Migration, self).apply(project_state, schema_editor, collect_sql)
|