Ticket #15321: sub_sub_unique_fix

File sub_sub_unique_fix, 4.1 KB (added by sswang, 13 years ago)

fix for sub sub inheritance uniqueness

Line 
1Index: django/db/models/base.py
2===================================================================
3--- django/db/models/base.py (revision 15796)
4+++ django/db/models/base.py (working copy)
5@@ -677,23 +677,25 @@
6 # Gather a list of checks for fields declared as unique and add them to
7 # the list of checks.
8
9- fields_with_class = [(self.__class__, self._meta.local_fields)]
10- for parent_class in self._meta.parents.keys():
11- fields_with_class.append((parent_class, parent_class._meta.local_fields))
12+ fields_with_class = []
13+ for field in self._meta.fields:
14+ name, model_class, junk, junk = self._meta.get_field_by_name(field.name)
15+ if model_class == None:
16+ model_class = self.__class__
17+ fields_with_class.append((model_class, field))
18
19- for model_class, fields in fields_with_class:
20- for f in fields:
21- name = f.name
22- if name in exclude:
23- continue
24- if f.unique:
25- unique_checks.append((model_class, (name,)))
26- if f.unique_for_date and f.unique_for_date not in exclude:
27- date_checks.append((model_class, 'date', name, f.unique_for_date))
28- if f.unique_for_year and f.unique_for_year not in exclude:
29- date_checks.append((model_class, 'year', name, f.unique_for_year))
30- if f.unique_for_month and f.unique_for_month not in exclude:
31- date_checks.append((model_class, 'month', name, f.unique_for_month))
32+ for model_class, f in fields_with_class:
33+ name = f.name
34+ if name in exclude:
35+ continue
36+ if f.unique:
37+ unique_checks.append((model_class, (name,)))
38+ if f.unique_for_date and f.unique_for_date not in exclude:
39+ date_checks.append((model_class, 'date', name, f.unique_for_date))
40+ if f.unique_for_year and f.unique_for_year not in exclude:
41+ date_checks.append((model_class, 'year', name, f.unique_for_year))
42+ if f.unique_for_month and f.unique_for_month not in exclude:
43+ date_checks.append((model_class, 'month', name, f.unique_for_month))
44 return unique_checks, date_checks
45
46 def _perform_unique_checks(self, unique_checks):
47Index: tests/modeltests/validation/models.py
48===================================================================
49--- tests/modeltests/validation/models.py (revision 15796)
50+++ tests/modeltests/validation/models.py (working copy)
51@@ -27,6 +27,12 @@
52 unique_integerfield = models.IntegerField(unique=True)
53 non_unique_field = models.IntegerField()
54
55+class SubUniqueFieldsModel(UniqueFieldsModel):
56+ pass
57+
58+class SubSubUniqueFieldsModel(SubUniqueFieldsModel):
59+ pass
60+
61 class CustomPKModel(models.Model):
62 my_pk_field = models.CharField(max_length=100, primary_key=True)
63
64Index: tests/modeltests/validation/test_unique.py
65===================================================================
66--- tests/modeltests/validation/test_unique.py (revision 15796)
67+++ tests/modeltests/validation/test_unique.py (working copy)
68@@ -7,7 +7,8 @@
69 from django.utils import unittest
70
71 from models import (CustomPKModel, UniqueTogetherModel, UniqueFieldsModel,
72- UniqueForDateModel, ModelToValidate, Post, FlexibleDatePost)
73+ UniqueForDateModel, ModelToValidate, Post, FlexibleDatePost,
74+ SubSubUniqueFieldsModel)
75
76
77 class GetUniqueCheckTests(unittest.TestCase):
78@@ -149,3 +150,9 @@
79 self.fail("unique_for_month checks shouldn't trigger when the associated DateField is None.")
80 except:
81 self.fail("unique_for_month checks shouldn't explode when the associated DateField is None.")
82+
83+ def test_sub_sub_unique_check(self):
84+ unique_sub_sub = SubSubUniqueFieldsModel.objects.create(unique_charfield="unique_charfield", unique_integerfield=1, non_unique_field=2)
85+ unique_sub_sub2 = SubSubUniqueFieldsModel(unique_charfield="unique_charfield", unique_integerfield=1, non_unique_field=2)
86+ self.assertRaises(ValidationError, unique_sub_sub2.full_clean)
87+
Back to Top