mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #22356 -- Added a check to make sure unique_together fields are local.
This commit is contained in:
		
				
					committed by
					
						 Simon Charette
						Simon Charette
					
				
			
			
				
	
			
			
			
						parent
						
							17c1884456
						
					
				
				
					commit
					0bcc92c691
				
			| @@ -1346,6 +1346,19 @@ class Model(six.with_metaclass(ModelBase)): | ||||
|                             id='models.E013', | ||||
|                         ) | ||||
|                     ) | ||||
|                 elif field not in cls._meta.local_fields: | ||||
|                     errors.append( | ||||
|                         checks.Error( | ||||
|                             ("'%s' refers to field '%s' which is not local " | ||||
|                              "to model '%s'.") % ( | ||||
|                                 option, field_name, cls._meta.object_name | ||||
|                             ), | ||||
|                             hint=("This issue may be caused by multi-table " | ||||
|                                   "inheritance."), | ||||
|                             obj=cls, | ||||
|                             id='models.E016', | ||||
|                         ) | ||||
|                     ) | ||||
|         return errors | ||||
|  | ||||
|     @classmethod | ||||
|   | ||||
| @@ -44,6 +44,7 @@ Models | ||||
| * **models.E013**: ``index_together/unique_together`` refers to a ManyToManyField ``<field name>``, but ManyToManyFields are not supported for that option. | ||||
| * **models.E014**: ``ordering`` must be a tuple or list (even if you want to order by only one field). | ||||
| * **models.E015**: ``ordering`` refers to the non-existent field ``<field name>``. | ||||
| * **models.E016**: ``index_together/unique_together`` refers to field ``<field_name>`` which is not local to model ``<model>``. | ||||
|  | ||||
| Fields | ||||
| ~~~~~~ | ||||
|   | ||||
| @@ -76,6 +76,30 @@ class IndexTogetherTests(IsolatedModelsTestCase): | ||||
|         ] | ||||
|         self.assertEqual(errors, expected) | ||||
|  | ||||
|     def test_pointing_to_non_local_field(self): | ||||
|         class Foo(models.Model): | ||||
|             field1 = models.IntegerField() | ||||
|  | ||||
|         class Bar(Foo): | ||||
|             field2 = models.IntegerField() | ||||
|  | ||||
|             class Meta: | ||||
|                 index_together = [ | ||||
|                     ["field2", "field1"], | ||||
|                 ] | ||||
|  | ||||
|         errors = Bar.check() | ||||
|         expected = [ | ||||
|             Error( | ||||
|                 ("'index_together' refers to field 'field1' which is not " | ||||
|                  "local to model 'Bar'."), | ||||
|                 hint=("This issue may be caused by multi-table inheritance."), | ||||
|                 obj=Bar, | ||||
|                 id='models.E016', | ||||
|             ), | ||||
|         ] | ||||
|         self.assertEqual(errors, expected) | ||||
|  | ||||
|     def test_pointing_to_m2m_field(self): | ||||
|         class Model(models.Model): | ||||
|             m2m = models.ManyToManyField('self') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user