I'm not sure if this is a bug, feature request, or something else, so I 
thought I'd start here.

Summary: *python manage.py inspectdb* makes all fields with a default value 
*blank=True, 
null=True*

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:


   - 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
      - Run *python manage.py inspectdb [--database DATABASE_NAME  [ TABLE 
   ] ] > models.py*
   - 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:

# from inspectdb.py 
<https://github.com/django/django/blob/master/django/core/management/commands/inspectdb.py#L144>
 (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*


# from introspection.py 
<https://github.com/django/django/blob/master/django/db/backends/mysql/introspection.py#L95
 
info.column_default> 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.

Am I missing something?

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" 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].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/8b20a83b-c54a-4fa4-b7fa-38ed8e2db35a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to