#29583: python manage.py inspectdb makes all fields with a default value
blank=True, null=True
-------------------------------------+-------------------------------------
               Reporter:  kimballo   |          Owner:  nobody
                   Type:  Bug        |         Status:  new
              Component:  Core       |        Version:  2.0
  (Management commands)              |       Keywords:  manage.py,
               Severity:  Normal     |  inspectdb, models
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  1
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Wasn't sure on the category or difficulty of fix, so logged it as an "easy
 pickings bug".

 I'm using:

 Ubuntu 16.04
 Python 3.7.0
 Django 2.0.4
 Mariadb 10.2.16

 Before I get into this, I realize that
 -"Django is best suited for developing new applications"
 -This probably isn't a huge deal or a high priority
 ...BUT I figured I'd submit this anyway while I was thinking about it.
 Maybe it'll save someone some extra work down the line.


 Steps to reproduce:

 1. Setup a legacy db in settings.py (see
 https://docs.djangoproject.com/en/2.0/howto/legacy-databases/)
 -Prerequisite: you have a column in one of your tables that has a default
 value.
 -Example: test_field int(11) DEFAULT 1
 2. Run python manage.py inspectdb [--database DATABASE_NAME  [ TABLE ] ] >
 models.py (or don't include "> models.py" and you can view the results
 from the command line)
 3. Open models.py
     -test_field will look something like this:
         {{{test_field = models.IntegerField(blank=True, null=True)}}}
     -What I would expect:
         {{{test_field = models.IntegerField(default=1)}}}

 What I've been able to dig up:

 #
 
https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fmaster%2Fdjango%2Fcore%2Fmanagement%2Fcommands%2Finspectdb.py%23L144&sa=D&sntz=1&usg=AFQjCNGZLkFkaqIJ1Ap1dhXRB0jARXcCoA
 # from inspectdb.py (line 144, comments included in the original file, )


 {{{
 142  # Add 'null' and 'blank', if the 'null_ok' flag was present in the
 143  # table description.
 144  if row[6]:  # If it's NULL...
 145      extra_params['blank'] = True
 146      extra_params['null'] = True
 }}}


 #
 
https://github.com/django/django/blob/master/django/db/backends/mysql/introspection.py#L95+info.column_default
 # from introspection.py in get_field_description (line 95, comment is
 mine)


 {{{
 86  fields = []
 87  for line in cursor.description:
 88         info = field_info[line[0]]
 89         fields.append(FieldInfo(
 90               *line[:3],
 91              to_int(info.max_len) or line[3],
 92              to_int(info.num_prec) or line[4],
 93              to_int(info.num_scale) or line[5],
 94              line[6],
 95              info.column_default, # THIS LINE IS JUST WHATEVER THE
 COLUMN DEFAULT IS
 96              info.extra,
 97              info.is_unsigned,
 98          ))
 99  return fields
 }}}


 I'm sure there are a lot of things I don't understand about this, but I
 don't think that having a default value should automatically add
 blank=True, null=True.
 Is having a default value really a "'null_ok' flag"?

 I think it should only put blank=True, null=True if the default is set to
 NULL in the column. Otherwise, it should set the default to whatever the
 default value is (ex: default=1)

 Caveat: I've only tested this with int fields.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29583>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.c1d4aa479c7912262d1e636b04fa316d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to