Index: django/db/models/base.py =================================================================== --- django/db/models/base.py (revision 15796) +++ django/db/models/base.py (working copy) @@ -677,23 +677,25 @@ # Gather a list of checks for fields declared as unique and add them to # the list of checks. - fields_with_class = [(self.__class__, self._meta.local_fields)] - for parent_class in self._meta.parents.keys(): - fields_with_class.append((parent_class, parent_class._meta.local_fields)) + fields_with_class = [] + for field in self._meta.fields: + name, model_class, junk, junk = self._meta.get_field_by_name(field.name) + if model_class == None: + model_class = self.__class__ + fields_with_class.append((model_class, field)) - for model_class, fields in fields_with_class: - for f in fields: - name = f.name - if name in exclude: - continue - if f.unique: - unique_checks.append((model_class, (name,))) - if f.unique_for_date and f.unique_for_date not in exclude: - date_checks.append((model_class, 'date', name, f.unique_for_date)) - if f.unique_for_year and f.unique_for_year not in exclude: - date_checks.append((model_class, 'year', name, f.unique_for_year)) - if f.unique_for_month and f.unique_for_month not in exclude: - date_checks.append((model_class, 'month', name, f.unique_for_month)) + for model_class, f in fields_with_class: + name = f.name + if name in exclude: + continue + if f.unique: + unique_checks.append((model_class, (name,))) + if f.unique_for_date and f.unique_for_date not in exclude: + date_checks.append((model_class, 'date', name, f.unique_for_date)) + if f.unique_for_year and f.unique_for_year not in exclude: + date_checks.append((model_class, 'year', name, f.unique_for_year)) + if f.unique_for_month and f.unique_for_month not in exclude: + date_checks.append((model_class, 'month', name, f.unique_for_month)) return unique_checks, date_checks def _perform_unique_checks(self, unique_checks): Index: tests/modeltests/validation/models.py =================================================================== --- tests/modeltests/validation/models.py (revision 15796) +++ tests/modeltests/validation/models.py (working copy) @@ -27,6 +27,12 @@ unique_integerfield = models.IntegerField(unique=True) non_unique_field = models.IntegerField() +class SubUniqueFieldsModel(UniqueFieldsModel): + pass + +class SubSubUniqueFieldsModel(SubUniqueFieldsModel): + pass + class CustomPKModel(models.Model): my_pk_field = models.CharField(max_length=100, primary_key=True) Index: tests/modeltests/validation/test_unique.py =================================================================== --- tests/modeltests/validation/test_unique.py (revision 15796) +++ tests/modeltests/validation/test_unique.py (working copy) @@ -7,7 +7,8 @@ from django.utils import unittest from models import (CustomPKModel, UniqueTogetherModel, UniqueFieldsModel, - UniqueForDateModel, ModelToValidate, Post, FlexibleDatePost) + UniqueForDateModel, ModelToValidate, Post, FlexibleDatePost, + SubSubUniqueFieldsModel) class GetUniqueCheckTests(unittest.TestCase): @@ -149,3 +150,9 @@ self.fail("unique_for_month checks shouldn't trigger when the associated DateField is None.") except: self.fail("unique_for_month checks shouldn't explode when the associated DateField is None.") + + def test_sub_sub_unique_check(self): + unique_sub_sub = SubSubUniqueFieldsModel.objects.create(unique_charfield="unique_charfield", unique_integerfield=1, non_unique_field=2) + unique_sub_sub2 = SubSubUniqueFieldsModel(unique_charfield="unique_charfield", unique_integerfield=1, non_unique_field=2) + self.assertRaises(ValidationError, unique_sub_sub2.full_clean) +