From 2d12a599383efff4ac1914e4cc5cf3b08cb2ff53 Mon Sep 17 00:00:00 2001 From: Adam DePue Date: Wed, 5 Nov 2014 02:57:47 +0000 Subject: [PATCH] [1.7.x] Fixed #23761 -- Fixed crash with MySQL validator and db_type is None. The issue was fixed on master in e9103402c0fa873aea58a6a11dba510cd308cb84. --- django/db/backends/mysql/validation.py | 4 ++++ docs/releases/1.7.2.txt | 5 ++++- .../test_custom_fields.py | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/invalid_models_tests/test_custom_fields.py diff --git a/django/db/backends/mysql/validation.py b/django/db/backends/mysql/validation.py index cd7503a352..d69cb7e3e0 100644 --- a/django/db/backends/mysql/validation.py +++ b/django/db/backends/mysql/validation.py @@ -17,6 +17,10 @@ class DatabaseValidation(BaseDatabaseValidation): if getattr(field, 'rel', None) is None: field_type = field.db_type(connection) + # Ignore any non-concrete fields + if field_type is None: + return errors + if (field_type.startswith('varchar') # Look for CharFields... and field.unique # ... that are unique and (field.max_length is None or int(field.max_length) > 255)): diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 207b7d2a0c..976210367d 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -51,8 +51,11 @@ Bugfixes (:ticket:`23420`). * Fixed a migration serializing bug involving ``float("nan")`` and - ``float("inf")`` (:ticket:23770:). + ``float("inf")`` (:ticket:`23770`). * Fixed a regression where custom form fields having a ``queryset`` attribute but no ``limit_choices_to`` could not be used in a :class:`~django.forms.ModelForm` (:ticket:`23795`). + +* Fixed a custom field type validation error with MySQL backend when + ``db_type`` returned ``None`` (:ticket:`23761`). diff --git a/tests/invalid_models_tests/test_custom_fields.py b/tests/invalid_models_tests/test_custom_fields.py new file mode 100644 index 0000000000..03e65b599b --- /dev/null +++ b/tests/invalid_models_tests/test_custom_fields.py @@ -0,0 +1,20 @@ +from django.db import models + +from .base import IsolatedModelsTestCase + + +class CustomFieldTest(IsolatedModelsTestCase): + + def test_none_column(self): + class NoColumnField(models.AutoField): + def db_type(self, connection): + # None indicates not to create a column in the database. + return None + + class Model(models.Model): + field = NoColumnField(primary_key=True, db_column="other_field") + other_field = models.IntegerField() + + field = Model._meta.get_field('field') + errors = field.check() + self.assertEqual(errors, [])