django中模型类变更问题

1、首先在models.py里面创建模型, 然后执行makemigrations和migrate同步数据库

from django.db import models

# Create your models here.


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return  self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()

    def __str__(self):
        return self.headline

2、删除模型Entry中部分字段,执行makemigrations和migrate会直接成功

from django.db import models

# Create your models here.


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return  self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    # pub_date = models.DateField()
    # mod_date = models.DateField()
    # authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()

    def __str__(self):
        return self.headline

3、新增模型Entry中部分字段number_of_pingbacks2,执行makemigrations和migrate, 若没有null=True的参数, 执行makemigrations和migrate会提示输入默认值

所以解决办法:

3.1、null=True ;

number_of_pingbacks2 = models.IntegerField(null=True)

3.2、设置默认值,可以参数default方式; 这种方法,在创建对象的时候, 是必须传值的

number_of_pingbacks2 = models.IntegerField(default= None)

也可以执行makemigrations的时候手动输入

from django.db import models

# Create your models here.


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return  self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    # pub_date = models.DateField()
    # mod_date = models.DateField()
    # authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()
    number_of_pingbacks2 = models.IntegerField()

    def __str__(self):
        return self.headline

执行makemigrations后,提示如下:

manage.py@untitled1 > makemigrations
"D:Program FilesPyCharm 2018.1.4in
unnerw.exe" "D:Program Filespython3.6.7python.exe" "D:Program FilesPyCharm 2018.1.4helperspycharmdjango_manage.py" makemigrations D:/pythonWorkspace/untitled1
Tracking file by folder pattern:  migrations
You are trying to add a non-nullable field 'number_of_pingbacks2' to entry without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 

4、默认null=False, 代表创建对象,对应的属性必须有值

 

c = Blog(name='gerry Blog')
c.save()

创建对象的时候,只传入name, 没有传入tagline的值,但是可以创建成功;

由此,推测django是将tagline当空字符串来处理的,所以列值是空,而不是默认的Null;

把设计表,不是Null的限制取消:

 执行插入命令,只插入name, 不插入tagline,效果如下:

 

 再将设计表,tagline设置为不允许Null,  因为已经存在Null类型的tagline数据,所以会报错

 

原文地址:https://www.cnblogs.com/harryTree/p/11913082.html