I defined below model and getting

error : You are trying to add a non-nullable field 'user' to videodata without a default; we can't do that


class User(Model):
    userID = models.IntegerField()
    userName = models.CharField(max_length=40)
    email = models.EmailField()
    class Meta:
        ordering = ['userName']
        verbose_name="User MetaData"
        verbose_name_plural="Users MetaData"
    def __unicode__(self):
        return str(self.userName)

class VideoData(Model):
    video = models.CharField(max_length=40)
    time  = models.IntegerField()
    user = models.ForeignKey(User, related_name="User")
    class Meta:
        verbose_name="User_Video MetaData"

Where i am doing wrong????

As the error says, your user field on VideoData is not allowing nulls, so you either need to give it a default user or allow nulls. Easiest way is to allow nulls.

user = models.ForeignKey(User, related_name="User", null=True)

or have a default user

user = models.ForeignKey(User, related_name="User", default=<have your default user id here>)

I have run into the same problem with my OneToOneField. And, what I did was to delete all the migration files (which are under the directory of migrations under your app), and ran:

python manage.py makemigrations


python manage.py migrate

I don’t know why, but it worked in my case. It won’t hurt you to try what I wrote above.

Good luck!

Here is what I did to fix the same issue

  1. Comment the foreign key reference in videodata and run the makemigrations and migrate
  2. Add the model in admins.py and make a new entry in table
  3. Now uncomment the foreign key reference and provide a default=1 .Run make migrations and migrate
  4. Remove the default=1 in foreign key field.

Hope this helps.
This solution will work everytime you face these kinds of error.

Here is what I do:

  1. change requirement = models.ForeignKey(Requirement) to requirement = models.ForeignKey(Requirement, null=True)
  2. run makemigrations and migrate
  3. change back requirement = models.ForeignKey(Requirement, null=True) to requirement = models.ForeignKey(Requirement)
  4. run makemigrations and migrate again.

I guess the rule of django-orm about foreignKey is:

  1. allow foreignKey to be null when first create table
  2. reject to add a foreignKey which is null, because the foreignKey of the data insert into table before will be null, which against programmer’s will
  3. allow to change foreignKey from not null to null.

The problem sometimes happens when you make a lot of changes in your models.py file (in my case It was related to an ImageField non-nullable field). Rather than field problems indeed. One solution in django 2.0.2 , python 3.6.4 , mysql 5.7.21

  • Delete all files inside migrations folder general_app/migrations/*.py, except __init__.py, be careful.

You could check if the problem was fixed, if not:

  • Repeat the above step, and
  • Delete your database (e.g. in mysql mysql> DROP DATABASE <name_db>)
  • Now create a new one with the same name mysql> CREATE DATABASE <name_db>.

These steps fixed the issue in my case. Now you could run without mistakes:

$ python manage.py makemigrations
$ python manage.py migrate

I have faced the same issue: …non-nullable field ‘user’ to videodata…

model: Videodata

field: user

just add one more attr in the field user of the model Videodata: default=””

The problem happens when I use TextField().
I found my previous migration file somehow overwrites new fields.
Cleaning previous migration files before re-migrating happens resolve the issue.