diff options
| author | Antoine Catton <acatton@fusionbox.com> | 2015-10-09 10:55:19 -0600 |
|---|---|---|
| committer | Simon Charette <charette.s@gmail.com> | 2015-10-12 18:00:59 -0400 |
| commit | 80dac8c33e7f6f22577e4346f44e4c5ee89b648c (patch) | |
| tree | 113d156bf62b84bad2dd758b033a8af864740a32 /django | |
| parent | 533c10998ad45854208d7e4b89d3c077faf16b8a (diff) | |
Fixed #25535 -- Made ForeignObject checks less strict.
Check that the foreign object `from_fields` are a subset of any unique
constraints on the foreign model.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/fields/related.py | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 24bab96df6..74a7a3e595 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -464,22 +464,35 @@ class ForeignObject(RelatedField): if not self.foreign_related_fields: return [] - has_unique_field = any(rel_field.unique - for rel_field in self.foreign_related_fields) - if not has_unique_field and len(self.foreign_related_fields) > 1: + unique_foreign_fields = { + frozenset([f.name]) + for f in self.remote_field.model._meta.get_fields() + if getattr(f, 'unique', False) + } + unique_foreign_fields.update({ + frozenset(ut) + for ut in self.remote_field.model._meta.unique_together + }) + foreign_fields = {f.name for f in self.foreign_related_fields} + + has_unique_constraint = any(u <= foreign_fields for u in unique_foreign_fields) + + if not has_unique_constraint and len(self.foreign_related_fields) > 1: field_combination = ', '.join("'%s'" % rel_field.name for rel_field in self.foreign_related_fields) model_name = self.remote_field.model.__name__ return [ checks.Error( - "None of the fields %s on model '%s' have a unique=True constraint." + "No subset of the fields %s on model '%s' is unique" % (field_combination, model_name), - hint=None, + hint="Add a unique=True on any of the fields %s of '%s', or add them all or a " + "subset to a unique_together constraint." + % (field_combination, model_name), obj=self, id='fields.E310', ) ] - elif not has_unique_field: + elif not has_unique_constraint: field_name = self.foreign_related_fields[0].name model_name = self.remote_field.model.__name__ return [ |
