zoukankan      html  css  js  c++  java
  • Django

    Django - models.py 应用

     编写 models.py 文件

    from django.db import models
    
    # Create your models here.
    
    
    class User_info(models.Model):
    
        username = models.CharField(max_length=25,verbose_name='用户名')
        password = models.CharField(max_length=25,verbose_name='密码')
        age = models.IntegerField()
        e_mail = models.EmailField()
        create_time = models.DateTimeField()
        update_time = models.DateTimeField()

     字段类型

      一般数据库中字段类型大概5种(字符串/数字/浮点型/时间类型/布尔类型),但Django为了在后台admin中可以操作数据库,同时为了限制在admin中对数据库的无效操作,Model中设置了很多种数据类型。

    1、models.AutoField  自增列=int(11)
      如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=True)
    2、models.CharField  字符串类型字段 必须加max_length参数
    3、models.BooleanField 布尔类型字段=tinyint(1)  不能为空,Blank=True
    4、models.ComaSeparatedIntegerField  用逗号分割的数字类型=varchar 继承CharField,所以必须加max_lenght参数
    5、models.DateField  日期字段类型date
      参数auto_now=True表示每次更新都会更新这个时间;参数auto_now_add表示只是第一次创建时添加,之后的更新不再改变
    6、models.DateTimeField  日期字段类型datetime  同DateField的参数
    7、models.Decimal  十进制小数类型=decimal
      必须指定整数位max_digits和小数位decimal_places
    8、models.EmailField  字符串类型(正则表达式邮箱)=varchar  对字符串进行正则表达式验证
    9、models.FloatField  浮点类型=double
    10、models.IntegerField  整形
    11、models.BigIntegerField 长整形
      integer_field_ranges = {
        'SmallIntegerField': (-32768, 32767),
        'IntegerField': (-2147483648, 2147483647),
        'BigIntegerField': (-9223372036854775808, 9223372036854775807),
        'PositiveSmallIntegerField': (0, 32767),
        'PositiveIntegerField': (0, 2147483647),
      }
    12、models.IPAddressField  字符串类型(ip4正则表达式)
    13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
      参数protocol可以是:both、ipv4、ipv6  验证时,会根据设置进行报错
    14、models.NullBooleanField  允许为空的布尔类型
    15、models.PositiveIntegerFiel  正Integer
    16、models.PositiveSmallIntegerField  正smallInteger
    17、models.SlugField  减号、下划线、字母、数字
    18、models.SmallIntegerField  数字
      数据库中的字段有:tinyintsmallintintbigint
    19、models.TextField  字符串=longtext
    20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
    21、models.URLField  字符串类型,地址正则表达式
    22、models.BinaryField 二进制
    23、models.ImageField   图片
    24、models.FilePathField 文件

    执行命令:

    # 执行以下命令,记录我们对models.py的所有改动
    python manage.py makemigrations

     执行后生成如下文件

    # Generated by Django 2.1.2 on 2018-12-11 11:39
    
    from django.db import migrations, models
    
    
    class Migration(migrations.Migration):
    
        initial = True
    
        dependencies = [
        ]
    
        operations = [
            migrations.CreateModel(
                name='User_info',
                fields=[
                    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                    ('username', models.CharField(max_length=25, verbose_name='用户名')),
                    ('password', models.CharField(max_length=25, verbose_name='密码')),
                    ('age', models.IntegerField()),
                    ('e_mail', models.EmailField(max_length=254)),
                    ('create_time', models.DateTimeField()),
                    ('update_time', models.DateTimeField()),
                ],
            ),
        ]

    代码如下

    #如下 这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性
    python manage.py migrate

     执行该命令后 数据库生成如下数据库表

    如上图得到的表名 是以应用名命名的,但是不是我们想要的怎么办了,增加两行代码

    如下:

    from django.db import models
    
    # Create your models here.
    from django.db  import models
    
    class User_info(models.Model):
    
        username = models.CharField(max_length=25,verbose_name='用户名')
        password = models.CharField(max_length=25,verbose_name='密码')
        age = models.IntegerField()
        e_mail = models.EmailField()
        create_time = models.DateTimeField()
        update_time = models.DateTimeField()
    
    
        class Meta:
            db_table = 'User_info'

    修改代码重新执行 

    # 执行以下命令,记录我们对models.py的所有改动
    python manage.py makemigrations

    此时新生成了 一个migrations 文件

    此时可以针对 新的文件进行执行

    python manage.py  migrate ModelMysql 0002_auto_20181211_1150

    查看数据库表得到新建的数据表

    python manage.py makemigrations这个命令是记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件例如:0001文件,如果你接下来还要进行改动的话可能生成就是另外一个文件不一定都是0001文件,但是这个命令并没有作用到数据库,这个刚刚我们在上面的操作过程之后已经看到了,而当我们执行python manage.py migrate 命令时  这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性

       另外一个需要注意的是这两个命令默认情况下是作用于全局,也就是对所有最新更改的models或者migrations下面的迁移文件进行对应的操作,如果要想仅仅对部分app进行作用的话  则执行如下命令:

    python manage.py makemigrations appname,

    python manage.py migrate appname,

    如果要想精确到某一个迁移文件则可以使用:

    python manage.py migrate appname 文件名
     

    遇到问题:

    1、No migrations to apply(django不能创建数据库中的表的问题)

     如下图:

    解决办法:

    第一步:

        删除该app名字下的migrations下除__init__.py外的文件。

    第二步:

        进入数据库,找到django_migrations的表,删除该app名字的所有记录。

    第三步:执行下面这两条命令:(在项目目录下)

    python manage.py makemigrations

    python manage.py migrate

    原因:

    django_migrations表记录着数据库的对应表的修改记录。

    每次修改后,都执行第三步的命令,然后在第一步的文件夹下生成修改的文件,django_migrations表记录修改的变更过程。

    2、

    Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
    result = self._query(query)

    修改options 如下: 

    # MySQL  adil   密码:helloyyj
    DATABASES = {
        'default':{
         'ENGINE':'django.db.backends.mysql',
         'HOST':'127.0.0.1',
         'PORT':'3306',
         'NAME':'pyweb',  # 数据库名
         'USER':'adil',
         'PASSWORD':'helloyyj',
         'OPTIONS':{
             'sql_mode': 'traditional'
         },
        }
    }

    3、No changes detected

     执行命令 python manage.py makemigrations  提示如下
    No changes detected

    解决办法:修改命令 

    python manage.py makemigrations --empty defuse   ‘defuse’  为我的应用名

     提示:

    App 'defuse' could not be found. Is it in INSTALLED_APPS?  原来是没有在setting.py 添加应用,添加后即可成功。

  • 相关阅读:
    完结篇《产品在路上》
    产品经理的七个层次
    互联网产品的交互设计
    互联网产品的用户体验
    用户体验设计 UED (下)
    用户体验设计 UED (上)
    【100Days of 100 line Code】1 day
    leetcode 392.判断子序列(Java 贪心)
    leetcode 605.种花问题(java 贪心)
    leetcode 122.买卖股票的最佳时机||(Java 贪心)
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/10100820.html
Copyright © 2011-2022 走看看