Code

Ticket #8316: db-mysqltypeissue.2.diff

File db-mysqltypeissue.2.diff, 5.5 KB (added by julianb, 6 years ago)

v2

Line 
1Index: django/db/backends/mysql/creation.py
2===================================================================
3--- django/db/backends/mysql/creation.py        (revision 8349)
4+++ django/db/backends/mysql/creation.py        (working copy)
5@@ -19,8 +19,8 @@
6         'FloatField':        'double precision',
7         'IntegerField':      'integer',
8         'IPAddressField':    'char(15)',
9+        'KeyField':          'integer',
10         'NullBooleanField':  'bool',
11-        'OneToOneField':     'integer',
12         'PhoneNumberField':  'varchar(20)',
13         'PositiveIntegerField': 'integer UNSIGNED',
14         'PositiveSmallIntegerField': 'smallint UNSIGNED',
15Index: django/db/backends/oracle/creation.py
16===================================================================
17--- django/db/backends/oracle/creation.py       (revision 8349)
18+++ django/db/backends/oracle/creation.py       (working copy)
19@@ -28,8 +28,8 @@
20         'FloatField':                   'DOUBLE PRECISION',
21         'IntegerField':                 'NUMBER(11)',
22         'IPAddressField':               'VARCHAR2(15)',
23+        'KeyField':                     'NUMBER(11)',
24         'NullBooleanField':             'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
25-        'OneToOneField':                'NUMBER(11)',
26         'PhoneNumberField':             'VARCHAR2(20)',
27         'PositiveIntegerField':         'NUMBER(11) CHECK (%(qn_column)s >= 0)',
28         'PositiveSmallIntegerField':    'NUMBER(11) CHECK (%(qn_column)s >= 0)',
29Index: django/db/backends/postgresql/creation.py
30===================================================================
31--- django/db/backends/postgresql/creation.py   (revision 8349)
32+++ django/db/backends/postgresql/creation.py   (working copy)
33@@ -19,8 +19,8 @@
34         'FloatField':        'double precision',
35         'IntegerField':      'integer',
36         'IPAddressField':    'inet',
37+        'KeyField':          'integer',
38         'NullBooleanField':  'boolean',
39-        'OneToOneField':     'integer',
40         'PhoneNumberField':  'varchar(20)',
41         'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
42         'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
43Index: django/db/backends/sqlite3/creation.py
44===================================================================
45--- django/db/backends/sqlite3/creation.py      (revision 8349)
46+++ django/db/backends/sqlite3/creation.py      (working copy)
47@@ -20,8 +20,8 @@
48         'FloatField':                   'real',
49         'IntegerField':                 'integer',
50         'IPAddressField':               'char(15)',
51+        'KeyField':                     'integer',
52         'NullBooleanField':             'bool',
53-        'OneToOneField':                'integer',
54         'PhoneNumberField':             'varchar(20)',
55         'PositiveIntegerField':         'integer unsigned',
56         'PositiveSmallIntegerField':    'smallint unsigned',
57Index: django/db/models/fields/__init__.py
58===================================================================
59--- django/db/models/fields/__init__.py (revision 8349)
60+++ django/db/models/fields/__init__.py (working copy)
61@@ -808,6 +808,24 @@
62         defaults.update(kwargs)
63         return super(IPAddressField, self).formfield(**defaults)
64 
65+class KeyField(Field):
66+    empty_strings_allowed = False
67+    def get_db_prep_value(self, value):
68+        if value is None:
69+            return None
70+        return int(value)
71+
72+    def get_manipulator_field_objs(self):
73+        return [oldforms.IntegerField]
74+
75+    def get_internal_type(self):
76+        return "KeyField"
77+
78+    def formfield(self, **kwargs):
79+        defaults = {'form_class': forms.IntegerField}
80+        defaults.update(kwargs)
81+        return super(KeyField, self).formfield(**defaults)
82+
83 class NullBooleanField(Field):
84     empty_strings_allowed = False
85     def __init__(self, *args, **kwargs):
86Index: django/db/models/fields/related.py
87===================================================================
88--- django/db/models/fields/related.py  (revision 8349)
89+++ django/db/models/fields/related.py  (working copy)
90@@ -1,6 +1,6 @@
91 from django.db import connection, transaction
92 from django.db.models import signals, get_model
93-from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, FieldDoesNotExist
94+from django.db.models.fields import AutoField, Field, KeyField, PositiveIntegerField, PositiveSmallIntegerField, FieldDoesNotExist
95 from django.db.models.related import RelatedObject
96 from django.db.models.query import QuerySet
97 from django.db.models.query_utils import QueryWrapper
98@@ -710,11 +710,11 @@
99     def db_type(self):
100         # The database column type of a ForeignKey is the column type
101         # of the field to which it points. An exception is if the ForeignKey
102-        # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
103-        # in which case the column type is simply that of an IntegerField.
104+        # points to an AutoField, in which case the column type is simply that
105+        # of a KeyField.
106         rel_field = self.rel.get_related_field()
107-        if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
108-            return IntegerField().db_type()
109+        if isinstance(rel_field, AutoField):
110+            return KeyField().db_type()
111         return rel_field.db_type()
112 
113 class OneToOneField(ForeignKey):