Code

Ticket #8316: db-mysqltypeissue.4.diff

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

v4, effectively handling that as a special MySQL case

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