Kaydet (Commit) c7aff313 authored tarafından Tim Graham's avatar Tim Graham

Refs #25535 -- Minor edits to ForeignObject check changes.

üst 92c1ae1b
...@@ -474,7 +474,6 @@ class ForeignObject(RelatedField): ...@@ -474,7 +474,6 @@ class ForeignObject(RelatedField):
for ut in self.remote_field.model._meta.unique_together for ut in self.remote_field.model._meta.unique_together
}) })
foreign_fields = {f.name for f in self.foreign_related_fields} foreign_fields = {f.name for f in self.foreign_related_fields}
has_unique_constraint = any(u <= foreign_fields for u in unique_foreign_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: if not has_unique_constraint and len(self.foreign_related_fields) > 1:
...@@ -483,11 +482,12 @@ class ForeignObject(RelatedField): ...@@ -483,11 +482,12 @@ class ForeignObject(RelatedField):
model_name = self.remote_field.model.__name__ model_name = self.remote_field.model.__name__
return [ return [
checks.Error( checks.Error(
"No subset of the fields %s on model '%s' is unique" "No subset of the fields %s on model '%s' is unique."
% (field_combination, model_name), % (field_combination, model_name),
hint="Add a unique=True on any of the fields %s of '%s', or add them all or a " hint=(
"subset to a unique_together constraint." "Add unique=True on any of those fields or add at "
% (field_combination, model_name), "least a subset of them to a unique_together constraint."
),
obj=self, obj=self,
id='fields.E310', id='fields.E310',
) )
......
...@@ -189,8 +189,9 @@ Related Fields ...@@ -189,8 +189,9 @@ Related Fields
for ``<field name>``. for ``<field name>``.
* **fields.E306**: Related name must be a valid Python identifier or end with * **fields.E306**: Related name must be a valid Python identifier or end with
a ``'+'``. a ``'+'``.
* **fields.E310**: None of the fields ``<field1>``, ``<field2>``, ... on model * **fields.E310**: No subset of the fields ``<field1>``, ``<field2>``, ... on
``<model>`` have a ``unique=True`` constraint. model ``<model>`` is unique. Add ``unique=True`` on any of those fields or
add at least a subset of them to a unique_together constraint.
* **fields.E311**: ``<model>`` must set ``unique=True`` because it is * **fields.E311**: ``<model>`` must set ``unique=True`` because it is
referenced by a ``ForeignKey``. referenced by a ``ForeignKey``.
* **fields.E320**: Field specifies ``on_delete=SET_NULL``, but cannot be null. * **fields.E320**: Field specifies ``on_delete=SET_NULL``, but cannot be null.
......
...@@ -4,7 +4,7 @@ from operator import attrgetter ...@@ -4,7 +4,7 @@ from operator import attrgetter
from django.core.exceptions import FieldError from django.core.exceptions import FieldError
from django.db import models from django.db import models
from django.db.models.fields.related import ForeignObject from django.db.models.fields.related import ForeignObject
from django.test import TestCase, skipUnlessDBFeature from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.utils import translation from django.utils import translation
from .models import ( from .models import (
...@@ -394,21 +394,21 @@ class MultiColumnFKTests(TestCase): ...@@ -394,21 +394,21 @@ class MultiColumnFKTests(TestCase):
objs = [Person(name="abcd_%s" % i, person_country=self.usa) for i in range(0, 5)] objs = [Person(name="abcd_%s" % i, person_country=self.usa) for i in range(0, 5)]
Person.objects.bulk_create(objs, 10) Person.objects.bulk_create(objs, 10)
class TestModelCheckTests(SimpleTestCase):
def test_check_composite_foreign_object(self): def test_check_composite_foreign_object(self):
class Parent(models.Model): class Parent(models.Model):
a = models.PositiveIntegerField() a = models.PositiveIntegerField()
b = models.PositiveIntegerField() b = models.PositiveIntegerField()
class Meta: class Meta:
unique_together = ( unique_together = (('a', 'b'),)
('a', 'b'),
)
class Child(models.Model): class Child(models.Model):
a = models.PositiveIntegerField() a = models.PositiveIntegerField()
b = models.PositiveIntegerField() b = models.PositiveIntegerField()
value = models.CharField(max_length=255) value = models.CharField(max_length=255)
parent = ForeignObject( parent = ForeignObject(
Parent, Parent,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
...@@ -417,10 +417,7 @@ class MultiColumnFKTests(TestCase): ...@@ -417,10 +417,7 @@ class MultiColumnFKTests(TestCase):
related_name='children', related_name='children',
) )
field = Child._meta.get_field('parent') self.assertEqual(Child._meta.get_field('parent').check(from_model=Child), [])
errors = field.check(from_model=Child)
self.assertEqual(errors, [])
def test_check_subset_composite_foreign_object(self): def test_check_subset_composite_foreign_object(self):
class Parent(models.Model): class Parent(models.Model):
...@@ -429,16 +426,13 @@ class MultiColumnFKTests(TestCase): ...@@ -429,16 +426,13 @@ class MultiColumnFKTests(TestCase):
c = models.PositiveIntegerField() c = models.PositiveIntegerField()
class Meta: class Meta:
unique_together = ( unique_together = (('a', 'b'),)
('a', 'b'),
)
class Child(models.Model): class Child(models.Model):
a = models.PositiveIntegerField() a = models.PositiveIntegerField()
b = models.PositiveIntegerField() b = models.PositiveIntegerField()
c = models.PositiveIntegerField() c = models.PositiveIntegerField()
d = models.CharField(max_length=255) d = models.CharField(max_length=255)
parent = ForeignObject( parent = ForeignObject(
Parent, Parent,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
...@@ -447,7 +441,4 @@ class MultiColumnFKTests(TestCase): ...@@ -447,7 +441,4 @@ class MultiColumnFKTests(TestCase):
related_name='children', related_name='children',
) )
field = Child._meta.get_field('parent') self.assertEqual(Child._meta.get_field('parent').check(from_model=Child), [])
errors = field.check(from_model=Child)
self.assertEqual(errors, [])
...@@ -508,9 +508,11 @@ class RelativeFieldTests(IsolatedModelsTestCase): ...@@ -508,9 +508,11 @@ class RelativeFieldTests(IsolatedModelsTestCase):
errors = field.check() errors = field.check()
expected = [ expected = [
Error( Error(
"No subset of the fields 'country_id', 'city_id' on model 'Person' is unique", "No subset of the fields 'country_id', 'city_id' on model 'Person' is unique.",
hint="Add a unique=True on any of the fields 'country_id', 'city_id' of 'Person', " hint=(
"or add them all or a subset to a unique_together constraint.", "Add unique=True on any of those fields or add at least "
"a subset of them to a unique_together constraint."
),
obj=field, obj=field,
id='fields.E310', id='fields.E310',
) )
...@@ -1404,15 +1406,12 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase): ...@@ -1404,15 +1406,12 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase):
c = models.PositiveIntegerField() c = models.PositiveIntegerField()
class Meta: class Meta:
unique_together = ( unique_together = (('a', 'b', 'c'),)
('a', 'b', 'c'),
)
class Child(models.Model): class Child(models.Model):
a = models.PositiveIntegerField() a = models.PositiveIntegerField()
b = models.PositiveIntegerField() b = models.PositiveIntegerField()
value = models.CharField(max_length=255) value = models.CharField(max_length=255)
parent = ForeignObject( parent = ForeignObject(
Parent, Parent,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
...@@ -1425,9 +1424,11 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase): ...@@ -1425,9 +1424,11 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase):
errors = field.check(from_model=Child) errors = field.check(from_model=Child)
expected = [ expected = [
Error( Error(
"No subset of the fields 'a', 'b' on model 'Parent' is unique", "No subset of the fields 'a', 'b' on model 'Parent' is unique.",
hint="Add a unique=True on any of the fields 'a', 'b' of 'Parent', or add them " hint=(
"all or a subset to a unique_together constraint.", "Add unique=True on any of those fields or add at least "
"a subset of them to a unique_together constraint."
),
obj=field, obj=field,
id='fields.E310', id='fields.E310',
), ),
...@@ -1442,16 +1443,13 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase): ...@@ -1442,16 +1443,13 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase):
d = models.PositiveIntegerField() d = models.PositiveIntegerField()
class Meta: class Meta:
unique_together = ( unique_together = (('a', 'b', 'c'),)
('a', 'b', 'c'),
)
class Child(models.Model): class Child(models.Model):
a = models.PositiveIntegerField() a = models.PositiveIntegerField()
b = models.PositiveIntegerField() b = models.PositiveIntegerField()
d = models.PositiveIntegerField() d = models.PositiveIntegerField()
value = models.CharField(max_length=255) value = models.CharField(max_length=255)
parent = ForeignObject( parent = ForeignObject(
Parent, Parent,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
...@@ -1464,9 +1462,11 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase): ...@@ -1464,9 +1462,11 @@ class M2mThroughFieldsTests(IsolatedModelsTestCase):
errors = field.check(from_model=Child) errors = field.check(from_model=Child)
expected = [ expected = [
Error( Error(
"No subset of the fields 'a', 'b', 'd' on model 'Parent' is unique", "No subset of the fields 'a', 'b', 'd' on model 'Parent' is unique.",
hint="Add a unique=True on any of the fields 'a', 'b', 'd' of 'Parent', or add " hint=(
"them all or a subset to a unique_together constraint.", "Add unique=True on any of those fields or add at least "
"a subset of them to a unique_together constraint."
),
obj=field, obj=field,
id='fields.E310', id='fields.E310',
), ),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment