Code

Ticket #5671: unique.diff

File unique.diff, 4.8 KB (added by Nis Jørgensen <nis@…>, 7 years ago)

Patch doing both of the things mentioned in the article

Line 
1Index: django/db/models/fields/__init__.py
2===================================================================
3--- django/db/models/fields/__init__.py (revision 6453)
4+++ django/db/models/fields/__init__.py (working copy)
5@@ -87,8 +87,10 @@
6         self.name = name
7         self.verbose_name = verbose_name
8         self.primary_key = primary_key
9-        self.max_length, self.unique = max_length, unique
10-        self.blank, self.null = blank, null
11+        self.max_length = max_length
12+        self.unique = unique or primary_key
13+        self.blank = blank
14+        self.null = null
15         # Oracle treats the empty string ('') as null, so coerce the null
16         # option whenever '' is a possible value.
17         if self.empty_strings_allowed and settings.DATABASE_ENGINE == 'oracle':
18@@ -98,7 +100,8 @@
19         self.serialize = serialize
20         self.validator_list = validator_list or []
21         self.prepopulate_from = prepopulate_from
22-        self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
23+        self.unique_for_date = unique_for_date
24+        self.unique_for_month = unique_for_month
25         self.unique_for_year = unique_for_year
26         self._choices = choices or []
27         self.radio_admin = radio_admin
28Index: django/db/backends/oracle/base.py
29===================================================================
30--- django/db/backends/oracle/base.py   (revision 6453)
31+++ django/db/backends/oracle/base.py   (working copy)
32@@ -23,7 +23,6 @@
33 
34 class DatabaseFeatures(BaseDatabaseFeatures):
35     allows_group_by_ordinal = False
36-    allows_unique_and_pk = False        # Suppress UNIQUE/PK for Oracle (ORA-02259)
37     needs_datetime_string_cast = False
38     needs_upper_for_iops = True
39     supports_tablespaces = True
40Index: django/db/backends/__init__.py
41===================================================================
42--- django/db/backends/__init__.py      (revision 6453)
43+++ django/db/backends/__init__.py      (working copy)
44@@ -41,7 +41,6 @@
45 
46 class BaseDatabaseFeatures(object):
47     allows_group_by_ordinal = True
48-    allows_unique_and_pk = True
49     autoindexes_primary_keys = True
50     needs_datetime_string_cast = True
51     needs_upper_for_iops = False
52Index: django/core/management/commands/createcachetable.py
53===================================================================
54--- django/core/management/commands/createcachetable.py (revision 6453)
55+++ django/core/management/commands/createcachetable.py (working copy)
56@@ -21,10 +21,10 @@
57         for f in fields:
58             field_output = [qn(f.name), f.db_type()]
59             field_output.append("%sNULL" % (not f.null and "NOT " or ""))
60-            if f.unique:
61-                field_output.append("UNIQUE")
62             if f.primary_key:
63                 field_output.append("PRIMARY KEY")
64+            elif f.unique:
65+                field_output.append("UNIQUE")
66             if f.db_index:
67                 unique = f.unique and "UNIQUE " or ""
68                 index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
69Index: django/core/management/sql.py
70===================================================================
71--- django/core/management/sql.py       (revision 6453)
72+++ django/core/management/sql.py       (working copy)
73@@ -263,11 +263,11 @@
74         field_output = [style.SQL_FIELD(qn(f.column)),
75             style.SQL_COLTYPE(col_type)]
76         field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
77-        if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk):
78-            field_output.append(style.SQL_KEYWORD('UNIQUE'))
79         if f.primary_key:
80             field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
81-        if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys:
82+        elif f.unique:
83+            field_output.append(style.SQL_KEYWORD('UNIQUE'))
84+        if tablespace and connection.features.supports_tablespaces and f.unique and connection.features.autoindexes_primary_keys:
85             # We must specify the index tablespace inline, because we
86             # won't be generating a CREATE INDEX statement for this field.
87             field_output.append(connection.ops.tablespace_sql(tablespace, inline=True))
88@@ -427,7 +427,7 @@
89 
90     qn = connection.ops.quote_name
91     for f in model._meta.fields:
92-        if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys):
93+        if f.db_index and not (f.unique and connection.features.autoindexes_primary_keys):
94             unique = f.unique and 'UNIQUE ' or ''
95             tablespace = f.db_tablespace or model._meta.db_tablespace
96             if tablespace and connection.features.supports_tablespaces: