• Django 做migrations时出错,解决方案


    在做migrations的时候,偶尔会出现出错。


    在已有数据的表中新增字段时,会弹出下面的信息

    比如

    # models.py 文件里
    
    class User(models.Model):
        """
        用户表
        """
        name = models.CharField(verbose_name="姓名", max_length=32)
        mobile = models.CharField(verbose_name="手机号", max_length=11)
        email = models.EmailField(verbose_name="邮箱", max_length=128)
        gender = models.SmallIntegerField(verbose_name="性别", choices=((1, "男"), (2, "女")))
        depart = models.ForeignKey(verbose_name="所属部门", to="Department", to_field="id", on_delete=models.CASCADE)
    
    	# 添加一个新列
    	age = models.IntegerField(verbose_name="年龄")
    
    

    运行这个命令时

    python manage.py makemigrations
    

    会出现下面的情况:因为当新的field创建时,Django 会考虑到原先已创建的表里是有数据的,为了不影响现有的数据,Django会让你提供default value给新的列
    请添加图片描述

    第一种解决方案
    请添加图片描述

    之后执行命令行

    python manage.py migrate
    

    第二种解决方案
    在创建一个model的时候,直接附上 default 的值

    # models.py 
    
    class User(models.Model):
        """
        用户表
        """
        name = models.CharField(verbose_name="姓名", max_length=32)
        mobile = models.CharField(verbose_name="手机号", max_length=11)
        email = models.EmailField(verbose_name="邮箱", max_length=128)
        gender = models.SmallIntegerField(verbose_name="性别", choices=((1, "男"), (2, "女")))
        depart = models.ForeignKey(verbose_name="所属部门", to="Department", to_field="id", on_delete=models.CASCADE)
    
    	# 新增加的列
    	age2 = models.IntegerField(verbose_name="年龄", default=1)
    
    

    直接运行下面的命令行就可以添加了:

    python manage.py makemigrations
    
    python manage.py migrate
    

    migrate 无法生成表

    运行这个命令时

    python manage.py migrate
    

    会出现这种结果

    Operations to perform:
      Apply all migrations: admin, app01, auth, contenttypes, sessions
    Running migrations:
      No migrations to apply.
    

    出现无法生成表的原因是,去到 django_migrations 表里查看,就能知道之前已经创建了表。所以得在该表用sql语句来删除对应的app数据。
    请添加图片描述
    最后运行下面两个命令

    python manage.py makemigrations
    
    python manage.py migrate
    

    这样就可以创建表了。


    点个赞呗~

  • 相关阅读:
    java---约数个数(每日一道算法2022.9.10)
    Vue实战篇三十二:实现新闻的无限加载
    MongoDB教程(二):mongoDB引用shell
    微信小程序 behaviors
    题目:2667.创建 Hello World 函数
    Vue3:自定义图标选择器(包含 SVG 图标封装)
    13c++呵呵老师【pawn移动组件与碰撞】
    11 redis中分布式锁的实现
    ARM TrustZone技术介绍
    基于Php幼儿园管理系统
  • 原文地址:https://blog.csdn.net/BSCHN123/article/details/139307178