-------------------------动态URL、ORM操作--------------------------
创建虚拟环境:
https://blog.csdn.net/qq_43590972/article/details/89186236
创建项目分类App
python manage.py startapp app02

配置python虚拟环境:
升级pip
python -m pip install --upgrade pip
下载virtualenv:
pip install virtualenv
安装virtualenv:
pip install virtualenvwrapper-win


一个Project项目可以有多个app模块:
创建app模块:
python manage.py startapp app01

app01:
    -admin.py     Django自带的的后台管理相关配置
    -apps.py    
    -model.py    写类的,根据类创建数据库表
    -tests.py    单元测试
    # (多个views.py,可以创建views文件进行分类)
    -views.py    业务处理
    
    3.ORM操作
        http请求:
        url -> 视图(模板+数据)
        ORM操作表:
            创建、修改、删除表
        操作数据行:
            增删改查
        
        ORM利用三方工具连接数据库:
        
        Django默认连接SQLLite
        mysql默认:
            mysql -> MySQLDB()
            
        1.修改配置文件
        DATABASES = {
                'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': BASE_DIR / 'db.sqlite3',
            }
        }
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'pyday70',  # 要连接的数据库,连接前需要创建好
                'USER': 'root',  # 连接数据库的用户名
                'PASSWORD': '123456',  # 连接数据库的密码
                'HOST': '127.0.0.1',  # 连接主机,默认本级
                'PORT': 3308,  # 端口 默认3306
            }
        }
        2.将mysql默认连接修改为pymysql
        在项目的初始化文件中加载(__init__.py):
        import pymysql
        pymysql.install_as_MySQLdb()
        -----------------------------------报错------------------------------
        (报错1:django.db.utils.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual tha
            https://blog.csdn.net/xm_QUQ/article/details/101780159
            setting.py—>DATABASES 添加
            ‘OPTIONS’:{‘isolation_level’:None}
            设置隔离级别
        报错2:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1.    
            https://blog.csdn.net/lvluobo/article/details/107850673
            
            import pymysql
            # 指定版本
            pymysql.version_info = (1, 4, 13, "final", 0)
            pymysql.install_as_MySQLdb()  # 使用pymysql代替mysqldb连接数据库
            
        报错3:Django:报错 raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc)
        原因:Django2.1不再支持MySQL5.5,必须5.6版本以上
            https://www.cnblogs.com/yebaofang/p/9863678.html
            解决办法:
            二选一
            (1)Django降级到2.0
                pip install Django==2.0.0 -i https://pypi.douban.com/simple
            (2)MySQL升级
        )
    三、models下创建和数据表对应的类
        需要注册:INSTALLED_APPS注册上['app01']
        
        1.    创建数据库表:
            **************    命令:
            **************    python manage.py makemigrations
            **************    python manage.py migrate
            执行上面的语句是会在migrations下面生成py文件
            --------------------------------------------------------------
            class UserGroup(models.Model):
                title = models.CharField(max_length=32)
                
            class UserInfo(models.Model):
                # 设置自增长,主键
                # nid = models.BigAutoField()
                # 可以自动生成id,可以不写
                nid = models.AutoField(primary_key=True)
                username = models.CharField(max_length=64)
                password = models.CharField(max_length=32)
                # 增加一列的时候需要赋初值。null = True 或者 default=1
                age = models.IntegerField(default=1)

                '''
                1、
                # ug_id
                # Django2.0定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
                # TypeError: __init__() missing 1 required positional argument: 'on_delete'
                2、关于别的属性的介绍
                CASCADE: 这就是默认的选项,级联删除,你无需显性指定它。
                PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
                SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank = True, null = True, 定义该字段的时候,允许为空。
                SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
                SET(): 自定义一个值,该值当然只能是对应的实体了
                '''
                ug = models.ForeignKey("UserGroup", on_delete=models.SET_NULL, null=True, blank=True)
        2.    在views模块的函数中对数据表进行CUDR操作
            def sqlCRUDViews(request):
                # 导入models模块
                from app01 import models
                
                # 增删改查
                
                --------------1.增------------------
                # models.UserGroup.objects.create(title='销售部')
                # 没有找到不会添加,也不会报错
                # models.UserInfo.objects.create(username='root', password='pwd', ug_id=1)
                
                --------------2.查--------------
                # groupList QuerySet对象(可迭代对象) <QuerySet [<UserGroup: UserGroup object (6)>]>
                # 里面是一个列表,通过遍历将数据拿出来
                # groupList = models.UserGroup.objects.all()
                # 过滤,其他判定方式id__gt=1 id__lt=1
                # groupList = models.UserGroup.objects.filter(id=1)

                -------------3.删除-------------
                # 注意在级联操作下,删除对数据表的影响
                # 删除(先找到,然后删除)
                # models.UserGroup.objects.filter(id=1).delete()
                # 更新(先找到,然后更新)
                
                -------------4.更新--------------
                # models.UserGroup.objects.filter(id=1).update(title='公关部')
                print(groupList)
                return render(request, 'sqlCRUD.html', {'groupList': groupList})