django使用

一、关于django项目中的文件夹中的__init__.py文件。该文件的作用是:告诉python解释器此文件夹是python模块文件夹。什么意思呢?比如,我在一个django工程里新建了一个普通文件夹,里面是没有__init__.py文件的,如图:,他会提示没有相应模块,而当我在里面新建了一个__init__.py文件后,就变成:。以后随着工程越来越复杂,必定要新建很多文件夹来存放更多的py文件,这个步骤一定不能漏(虽然pycharm新建python文件夹的时候会一并创建__init__.py)。

二、关于makemigration和migrate(两个都是数据迁移)。这两个manage.py里面的命令都是和数据库有关的,makemigration是记录models.py里面模型的变化并将之保存为一个py文件,py文件保存到migration文件夹中,以如下的格式保存:

class Migration(migrations.Migration):

    dependencies = [
        ('TTEST', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='test',
            name='hehe',
            field=models.IntegerField(default=3),
        ),
    ]

  而migrate则是读取migration文件夹相应的py文件,然后对数据内的表进行相应地变化,如上图的代码用migrate命令执行完后的变化:

migrate有一个个人觉得挺好的方面,就是在models.py下删除了某个类的某项属性,不会删除有数据的列。例如刚刚的“hehe”列,假如有一项数据id=1,haha=1,hehe=1,则桑我注销掉hehe这属性时,再执行makemigration和migrate之后,数据库的“hehe”不会被移除

class Test(models.Model):
    haha = models.IntegerField(default=2,unique=True)
    # hehe = models.IntegerField(default=3,unique=False)

这个设定避免了编码时可能出现注销错了导致的数据丢失。

三、关于继承AbstractUser这个类。AbstractUser类是django提供的一个用户类,要使用继承AbstractUser的用户类,需要在settings加入如下代码:

AUTH_USER_MODEL = 'blog.Man'

若是工程中自定义的User需要继承AbstractUser的话,一定要注意,User若是添加一个新的字段,注意要为该字段添加默认值,或者设置可为空。为什么呢?因为django的models在migrate的时候,若是没有类继承AbstractUser,就会默认在数据库中建一个auth_user表来保存超级用户的数据,而若是继承了AbstractUser类,超级用户的数据就会保存到该表中。此时如果扩展了更多的字段,但是没有默认值或者没有设置允许为空的话,就会有如下的提示:

You are trying to add a non-nullable field 'sex' to user 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)
 2) Quit, and let me add a default in models.py
Select an option

  因此在继承了Abstractuser类的用户类添加更多字段时,要注意添加默认值或者设置为空.

原文地址:https://www.cnblogs.com/Xw-liang/p/4889397.html