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', |                             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 |         return errors | ||||||
|  |  | ||||||
|     @classmethod |     @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.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.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.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 | Fields | ||||||
| ~~~~~~ | ~~~~~~ | ||||||
|   | |||||||
| @@ -76,6 +76,30 @@ class IndexTogetherTests(IsolatedModelsTestCase): | |||||||
|         ] |         ] | ||||||
|         self.assertEqual(errors, expected) |         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): |     def test_pointing_to_m2m_field(self): | ||||||
|         class Model(models.Model): |         class Model(models.Model): | ||||||
|             m2m = models.ManyToManyField('self') |             m2m = models.ManyToManyField('self') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user