• 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数据,所以会报错

     

  • 相关阅读:
    浏览器打开developers.weixin.qq.com开头的网站加载特别慢或者无法打开
    微信小程序在微信开发者工具中打开时为何提示“小程序重启耗时过久,请确认业务逻辑中是否有复杂运算,或者死循环”?
    解决VMware Workstation 15 与Device/Credential Guard不兼容的问题
    Gitee同步项目后内容一致MD5不同
    Python2.7安装easy_install和pip
    php连接数据库
    css画三角形
    css的9个常用选择器
    Javafx弹窗
    javafx将数据库内容输出到tableview表格
  • 原文地址:https://www.cnblogs.com/harryTree/p/11913082.html
Copyright © 2020-2023  润新知